Skip to main content

Full text of "Amstrad CPC Book: Graphisme en Assembleur sur Amstrad CPC (1986)(PSI)(ES)"

See other formats


£5»» 



'"'O 



MATERIEL 



■r 



• 1 






I 

I 



GRAPHISME 

ENASSEMBLEUR 

SUR AMSTRAD CPC 



- 









■ 






- 



'I 



CONNAISSEZ-VOUS TOUTE LA COLLECTION AMSTRAD 
CHEZ P.S.I. ? 



Pour les Amstrad CPC 464. 664 et 6128 : 



Initiation : 

— La ttecouvorte de I'Amstrad - Daniel-Jean David 

— Exercices en BASIC pour Amstrad - Maurice Charbit 

Programmation BASIC : 

— 102 programmes pour Amstrad - Jacques Deconchat 

— Super jeux pour Amstrad - Jean- Francois Sehan 

— Amstrad en tamille - Jean-Francois Sehan 

— Super generateur de caracteres sur Amstrad - Jean-Francois Sehan 

— Photographie sur Amstrad et Apple II - Pierrick Moigneau et Xavier de la Tullaye 

— Amstrad en musique - Daniel Lemahieu 

— Trois etapes vers ('intelligence artfficielle sur Amstrad CPC - Ren6 Descamps 

Maitrise du BASIC : 

— BASIC Amstrad - 1. MiSthodes pratiques - Jacques Boisgontior et Bruno Cesard 

— BASIC Amstrad - 2. Programmes et fichiers - Jacques Boisgontiar 

— BASIC Plus : 80 routines sur Amstrad - Michel Martin 

— P6riph6riques et fichiers sur Amstrad - Daniel- Jean David 

Langages : 

— Assembleur de I'Amstrad - Marcel Henrot 

— Creation et onimotions grophiquoa sur Amstrad CPC - Gilles Fouchard et Jean-Yves Corre 

— Clefs pour dBASE II et III - Michel Keller 

— Turbo Pascal sur Amstrad - Pierre Brandeis et Freddric Bfanc 

Systeme : 

— Clefs pour Amstrad - 1. Systeme de base - Daniel Martin 

— CP/M Plus sur Amstrad 6128 et 8256 - Yvon Dargery 

— Clefs pour Amstrad - 2. Sysieme disquo - Daniel Martin et Philippe Jadoul 

A paraitre : 

— Intelligence artificielle : langage et formes sur Amstrad - Thierry Uvy-Abdgnolli at Olivier 
Magnan 

— Clefs pour Amstrad 8256 - Eric Baumarti 



Pour tout probleme rencontre dans les ouvrages P.S.I, 
vous pouvez nous contacter au numero ci-dessous : 



Numero Vert/Appel Gratuit en France 



05 21 22 01 

(Composer tous les chiffres, meme en region parisienne) 



La loi du 1 1 mars 1 957 n'autorisant, aux termes des alin^as 2 et 3 de I'article 41 , d'une part, que 
les a copies ou reproductions strictement reserves a I'usage prive" du copiste et non destinies a 
une utilisation collective ». et, d'autre part, que les analyses et les courtes citations dans un but 
d'exemple el d'illustration, « toute representation ou reproduction integrate, ou partielle, faite sans 
I© consentement de I'auteur ou de ses ayants droit ou oyants causo, est illicite » (alinea 1 "' do 
I'articte 40). 

Cette representation ou reproduction, par quelque proc&ie" que ce soit, constftuerait done une 
contrefacon sanctionnee par les articles 425 et suivants du Code Penal. 

O Editions du P.SJ. - B.P. 86 - 77402 LagnyfMarne cedex 

1986 
ISBN 2-86595-340-8 



MATERIEL 



GRAPHISME 

EN ASSEMBLEUR 

SUR AMSTRAD CPC 



FRANCIS PWROT 



A 



EDITIONS DU PSA. 
1986 



r 



Francis PIEROT a 23 ans. II pratique la micro-informatique depuis 1979. 
Ses etudes en Informatique et son gout pour l'6criture I'ont aiguille sur le 
chemin des magazines specialises. Apres avoir collabore a des revues 
d'informatique, il a rejoint le milieu de I'edition de logiciels. II a notamment 
dirige la realisation de METRO 2018 sur Amstrad. 

Ses passions : la science-fiction, les jeux de roles, la musique, et la 
micro-informatique. 



Amstrad Amdos et Amstrad CPC464, 664 et 6128 sont des marques 
deposees de Amstrad Consumer Electronics. 



Sommaire 



Introduction 9 

Chapitre 1 Les caracteristiques graphiques de I'Amstrad 1 1 

L'organisation materielle 12 

Instructions graphiques 23 

Chapitre 2 Utilisation du langage machine sous Basic 31 

Assembleur et langage machine 32 

Les outils du programmeur 34 

Programmation du Z-80 36 

Instructions du Z-80 40 

Assembleur et Basic 49 

Chapitre 3 Les routines graphiques du systeme 57 

Systeme d'exploitation 58 

Trace decercles 60 

Trace d'histogrammes 79 

Remplissage des zones 105 



6 I GRAPHEMES EN ASSEMBLEUR SUR AMSTRAD 

Chapitre 4 L'acces direct a la memoire ecran 

Objets graphiques 128 

Structure de la memoire ecran 129 

Restitution des objets 1 31 
Routine de restitution 
Routine de memorisation 
Remarques 



150 

163 



Chapitre 5 Codage des objets graphiques 165 

Pourquoi compacter ? 166 

Methodes de compactage 1 66 

Algorithme de compactage 168 

Decompactage 174 

Chapitre 6 Deplacements par calcul d'adresses 179 

Gestiondu joystick 1 80 

Deplacements par calcul d'adresses 1 82 

Consequences de la structure de la memoire ecran 184 

Chapitre 7 Gestion des objets surun decor 189 

Problemes de deplacement 190 

LemodeXOR 191 

Transparence 195 

Problemes de rapidite 1" 

Gestion des avant-plans 199 

Chapitre 8 Systemedecoordonnees 207 

Quel systeme de coordonnees ? 208 

Territoires interdits et collisions 208 

Routine de deplacement automatique 220 

Chapitre 9 Creation des objets et decors 229 

Programme de creation de dessins 230 

Creation de decor 241 

Compactage de phases d'animation d'un objet 243 

Annexe 1 Les mathematiques de I'informatique 247 

Annexe 2 Les adressessystemes utiles 255 

Annexe 3 Couleurset masques 259 

Annexe 4 Carte memoire Amstrad 262 

Annexe 5 Carte memoire des routines 265 

Liste des programmes du livre 265 
Emplacement des routines LM du livre 267 

Variables globales 268 



GRAPHEMES EN ASSEMBLEUR SUR AMSTRAD I 7 

Annexe 6 Structure ecran de I'Amstrad 270 

Annexe 7 Le jeu destruction du Z-80 275 

Annexe 8 Lexiqueet Index 283 

Annexe 9 Ladisquetted'accompagnement 293 

Conseils de lecture 297 



Introduction 



Tout amateur de micro-informatique, une fois franchie ia limite du Basic, 
se retrouve face a un mur epais qu'il parvient difficilement a percer. Ce mur 
indestructible separe le monde des programmeurs specialistes de celui des 
amateurs. Ses ingredients : musique, graphisme, langage machine. Trois 
obstacles infranchissables pour celui qui ne veut pas passer sa vie a 
programmer des jeux. 

C'est la raison d'etre de cet ouvrage. Vous y trouverez r outre un grand 
nombre d'informations concernant le graphisme sur Amstrad, un ensem- 
ble de routines detainees, de methodes de travail vous permettant de gerer 
des graphismes sur Amstrad, a la maniere des programmeurs specialises. 

Le but de ce livre est double. II aborde tous ies problemes de la gestion 
du graphisme sous un angle pedagogique. Les etapes de la creation des 
routines sont clairement expliquees, et les routines proprement dites 
dument commentees. II est possible d'utiliser les routines sans se forcer a 
lire la totalite des explications, mais il est aussi possible de s'initier £ leur 
utilisation en progressant page par page. 

Meme si la lecture de I'ouvrage ne vous donne pas la connaissance 
absolue et instantanee de tous les mysteres du graphisme sur Amstrad (qui 
pourrait pretendre les connaTtre tous ?), il est fort probable qu'elle provo- 
quera le d6clic, le : "Qa y est, j'y suis !" qui donne envie d'aller plus loin. Et 
en micro-informatique, I'envie de progresser est le debut de la connais- 
sance. 

Une derniere mise en garde s'impose toutefois : ce livre n'est pas destine 
S vous enseigner le langage machine, mais il peut vous apprendre k 
I'appliquer efficacement. Toutefois, I'utilisation des routines ne necessite 
pas sa connaissance. C'est pourquoi, un chapitre entier a ete consacre au 
langage machine et a son utilisation sous Basic. Le chapitre en question 
familiarisera avec I'assembleur ceux qui ne le pratiquent pas encore. 



10 I GRAPHEMES EN ASSEMBLEUR SUR AMSTRAD 

Enfin, bien que I'utilisation d'un programme assembleur soit hautement 
recommandee, toutes les routines seront fournies sous deux formats : 
listing assemble, pour programmer directement en assembleur, et pro- 
gramme Basic avec liste de DATA pour ceux qui ne possedent pas 
d'assembleur. Les routines seront done accessibles a tous. 

Pour des raisons de commodite, les annexes 1 et 7 sont tirees de 
I'ouvrage d'Alain Pinaud Programmer en Assembleur paru aux Editions du 
P.S.I. 



LES CARACTERISTIQUES 

GRAPHIQUES 
DE L'AMSTRAD 



1 



L'Amstrad n'est pas exceptionnellement doue pour le graphisme, mais il 
possede quelques particularites originales et interessantes. 



12 I GRAPHEMES EN ASSEMBLEUR SUR AMSTRAD 



^ORGANISATION MATERIELLE 



Les circuits 

Amstrad se ditingue au premier abord par son controleur video. Tandis 
que les autres constructeurs emploient des processeurs video, avec trace 
de ligne incorpore ou gestion d'une memoire ecran independante, Ams- 
trad a choisi une attitude radicalement differente. Le circuit utilise est un 
CRTC HD 6845. CRTC signifie Cathode Ray Tube Controler, soit controleur 
de tube cathodique. Son role est de transformer le contenu de la memoire 
ecran en signal pour I'ecran. L'utilisation du 6845 est peu banale en micro- 
informatique familiale : en fait, le micro-ordinateur le plus connu utilisant 
ce circuit pour I'affichage est I'IBM-PC. On ne peut pas reellement parler 
d'ordinateur familial. 

L'utilisation de ce circuit prend toute sa dimension lorsqu'on constate 
que, malgre sa rusticity le controleur est capable d'afficher 80 colonnes 
sans probteme de lisibilite, alors que beaucoup de micro-ordinateurs ne 
peuvent pas depasser 40 colonnes. 

De plus, pour pallier les faiblesses du 6845 (dont le seul travail est de 
generer des signaux video pour le moniteur) les concepteurs de la machine 
ont fort intelligemment programme un circuit annexe, le "Gate Array" (en 
traduction litterale, zone des portes) qui joue le role de bouche-trou : tout 
ce que les circuits standard de r Amstrad ne savent pas faire, il le fait. Par 
exemple, nous devons au Gate Array la possibility de choisir entre 27 
couleurs. Le 6845 en est incapable. Le Gate Array est I'interface entre les 
choix de I'utilisateur (les couleurs, le nombre de colonries, la resolution 
graphique, et ainsi de suite) et le controleur 6845 proprement dit (schema 
1.1). 



RAM 
ECRAN 



2^: 



16 kilos 



BUS 



3z: 



> 



Qate 

ARRAY 



couleurs 



PORT 
E/S 




:<£ 



Z-80 
PROCESSEUR 



6345 




balayage 
synchro 



ECRAN 



S± 



< 



acces 



Schema 1.1 



Organisation des elements visualisateurs. 



CARACTtRISTIQUES GRAPHIOUES I 13 

Bien que les fonctions d'affichage soient toutes disponibles dans le 
systeme d'exploitation sous forme de routines, il est des situations ou I'on 
peut vouloir programmer directement le controleur video ou le Gate Array. 
Ces deux circuits sont en effet accessibles au Z-80 par le biais destructions 
OUT. 

Le Gate Array (GA) produit les signaux video et RVB pour I'Scran. II 
s'occupe egalement des couleurs, des stylos, des modes ecran. II dispose & 
cet effet de trois registres : un registre "stylo" (recevant les numeros de 
stylo), un registre "couleur" (acceptant un numero de couleur) et un 
registre de commande. Nous appellerons ces registres respectivement 
STY, COU et COM. 

Le port $7F, ou 127, est dedie au GA. Comme tous les ports sur 
I'Amstrad, $7F est la partie haute du numero de port. Pour y acceder en 
Basic, on utilisera OUT &7F00, valeur. En langage machine, il faut utiliser la 
sequence suivante : 

LD C, valeur 
LD B,#7F 

OUT (C),C 

Cette derniere instruction OUT ne doit pas troubler le programmeur : ce 
n'est pas le registre C qui est utilise pour le numero de port mais B, qui est 
la partie haute de BC. 

Les registres du GA ne sont pas accessibles en lecture. On ne peut qu'y 
ecrire. Cela signifie qu'il est par exemple impossible de recuperer le 
numero de couleur associe a un stylo si on ne le memorise pas par ailleurs. 
Si vous demandez un changement de couleur du stylo par OUT en Basic, 
cette alteration ne va durer qu'une fraction de seconde. En effet, le Basic 
possede sa propre table de correspondance stylo/couleur, et cette table 
est regulierement retransmise au GA. II est done inutile de reprogrammer, 
sous Basic, les couleurs de stylo si Ton ne modifie pas egalement la table 
en question. 

Suivant la valeur binaire envoyee sur le port $7F, le GA enverra la donnee 
sur I'un des trois registres. Deux des huit bits de cette donn6e sont, en effet, 
utilises pour determiner le registre vise. II s'agit des deux bits de gauche : 

- une donnee de la forme OOxxxxxx sera envoyee au registre STY ; 

- une donnee de la forme Olxxxxxx sera envoyee au registre COU ; 

- une donnee de la forme 10xxxxxx sera envoyee au registre COM. 

Les six bits restants sont utilises differemment suivant le registre. Pour le 
registre STY, ce sont normalement les quatre bits de droite qui forment le 
numero de stylo a programmer, a moins que le cinquieme bit ne soit a 1, 
auquel cas e'est la bordure de I'ecran qui est visee. 

La donnee OOOOxxxx placera xxxx dans le registre STY, et permettra alors 
de programmer, par un autre OUT visant COU, la couleur de ce stylo. 
L'envoi de 0001 xxxx permettra de faire la meme chose mais pour la 
bordure (xxxx est alors ignore). 



14 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 

Pour le registre COU, seuls les cinq bits de droite sont utilises afin de 
connaitre le numero de couleur vise. La couleur ainsi envoyee est associee 
au stylo dont le numero se trouve dans le registre STY. On enverra done la 
valeur 010xxxxx, xxxxx etant fa valeur binaire de la couleur. Rappelons que 
les couleurs 27 a 31 sont identiques a cinq des autres couleurs. 

Le registre COM est plus complexe. II possede quatre fonctions, pouvant 
etre demandees simultanement (bien qu'elles n'aient pas grand chose a 
voir entre elles). 

II nous faut, pour examiner ces fonctions, numeroter les bits de la valeur 
envoyee. Nous utiliserons la notation classique b7 pour le bit 7, le plus a 
gauche, jusqu'a bO pour le bit 0, le plus a droite. 

Si b4 vaut 1, le compteur de synchronisation verticale est annule. Ce 
compteur est utilise pour generer I'impulsion a la base de toutes les 
interruptions de I'Amstrad. Le fait de I'annuler retarde cette impulsion, et 
permet done de repousser dans le temps la prochaine interruption. b4 est 
d'une utilisation tres puissante, puisqu'on peut grace a lui intervenir 
directement sur tout le systeme d'interruption ! 

Si b3 vaut 0, les adresses $C000 a $FFFF sont connectees sur la ROM du 
systeme d'exploitation, sinon elles sont connectees a la RAM ecran. Ceci 
concerne uniquement les acces en lecture, car lors des ecritures en 
memoire, le Z-80 emet un signal qui connecte automatiquement les RAM. 

Si b2 vaut 0, les adresses $0000 a $3FFF sont connectees sur la ROM du 
Basic. Meme remarque que pour b3 : ceci ne concerne que les lectures. 

Enfin, b1b0 est utilise pour determiner la resolution choisie. 00 indique 
mode (160 points sur 200, 16 stylos), 01 donne le mode 1 (320 sur 200, 4 
stylos) et 10 le mode 2 (640 sur 200, 2 stylos). 

Cela termine I'expose des fonctionnalites du GA. II nous reste le 6845. En 
I'occurrence, celui-ci peut etre utilise pour de nombreuses taches peu 
banales. Le controleur 6845 possede 18 registres, et un registre de 
selection. La programmation des registres R0 a R15 se fait de la fa<jon 
suivante : 

- selectionner le registre en envoyant son num6ro sur le port $BC. Ceci 
programme le numero dans le registre de selection. Seuls les cinq derniers 
bits sont pris en consideration, les valeurs a 17 etant les seules 
effectives ; 

- envoyer la donnee sur le port $BD. Ceci place la donn6e dans le registre 
selectionn6 (sauf R16/R17 qui ne peuvent qu'§tre lus). 

II est egalement possible de lire le contenu des registres R12 a R17, de la 
meme facjon : envoi du numero de registre sur le port $BC, lecture de 
donnee sur le port $BF et non $BD. 



CARACTERISTIQUES GRAPHIOUES I 15 

Examinons en detail les fonctions des registres : 

D RO : registre 8 bits. Nombre de caracteres par ligne, auquei est ajoute 
un nombre dependant de la duree de balayage sur les bords de I'ecran 
et du temps necessaire pour le retour du faisceau en debut de ligne. 

D R1 ; registre 8 bits. Nombre de caracteres reellement affiches par ligne. 
II s'agit de la valeur de base de ce nombre (voir ci-dessus RO). 

D R2 : registre 8 bits. Position horizontale. Decale vers la gauche ou la 
droite I'image ecran. La valeur centrale est 46. 

□ R3 : registre 4 bits. Ecartement des impulsions de synchronisation. 

D R4 : registre 7 bits. Nombre de lignes de grille par image. Permet de 
regier la synchronisation verticale en fonction de la frequence (50 Hz ou 
60 Hz suivant le pays). 

D R5 : registre 6 bits. Ajustement du balayage vertical. 

D R6 : registre 7 bits. Nombre de lignes de caracteres affichees (25). 

□ R7 : registre 7 bits. Position verticale. Decale vers le haut ou le bas 
I'image ecran. La valeur centrale est 30. 

□ R8 : registre 2 bits. Saut de ligne. Une valeur de donne I'affichage 
normal, une valeur de 1 donne un tremblotement 

D R9 : registre 5 bits. Nombre de lignes par caractere (7). 

O R10 : registre 7 bits. Attribut curseur. les bits bO a b4 indiquent la ligne 
d'ecran ou debute le curseur. Les bits b5 et b6 donnent le mode 
curseur : 00 curseur normal, 01 pas de curseur, 10 curseur clignotant 
rapide, 11 curseur clignotant lent. 

□ R11 : registre 5 bits. Ligne de fin curseur (voir R10). 

□ R12 : registre 6 bits. Poids fort d'adresse de debut de I'ecran (on y 
ajoute $C0O0 pour obtenir I'adresse en RAM-ecran). 



□ R13 
D R14 
D R15 
D R16 



registre 8 bits. Poids faibie de I'adresse de debut d'ecran. 
registre 6 bits. Poids fort d'adresse curseur (similaire a R12). 
registre 8 bits. Poids faibie d'adresse curseur (similaire a R13). 
registre 6 bits. Poids fort adresse ecran lorsque le stylo optique 



emet son signal. 

□ R17 : registre 8 bits. Poids faibie adresse ecran pour stylo optique (voir 
R16). 



16 I GRAPHISMES EN ASSEWBLEUR SUR AMSTRAD 

La memoire ecran 



Avant toute chose, parlons de la memoire ecran. L'Amstrad, si doue soit- 
il, ne peut pas afficher une information qu'il ne possede pas en memoire. II 
faut done que I'gcran soit stocke quelque part, si possible a un endroit 
directement accessible par I'utilisateur. De cette fagon, il est possible de 
modifier le contenu de I'ecran en changeant simplement son image en 
memoire. Sur certaines machines, la memoire ecran n'est accessible qu'au 
processeur video, et il faut lui demander explicitement de modifier cette 
memoire pour en avoir le droit. 

Application concrete : la memoire ecran de I'Amstrad est situee aux 
adresses memoire de 49152 a 65535. Pour etre plus pr6s de la machine, 
nous pouvons egalement dire entre COOO et FFFF hexadecimal. Elle est 
constituee de 16 Ko de memoire (soit 16384 adresses, 4000 en hexadeci- 
mal) qui constituent la totalite de I'image ecran. Vous pouvez d'ailleurs le 
constater tres simplement en executant le programme 1.1. 



1 o ' ******************** 

20 '** Programme 1-1 ** 

30 ' ************#***-*-**"* 

40 ' 

50 MODE 1 

60 INK 3,20 

70 contenu=255 

30 FOR adre5se=&C000 TO &FFFF 

90 POKE adr esse , contenu 

100 NEXT adresse 

110 END 



La ligne 50 est vitale : nous rencontrerons souvent I'instruction MODE. 
Elle indique en effet a I'ordinateur (plus exactement au fameux Gate Array) 
& quel type de resolution correspond le contenu de la memoire ecran, Le 
mode 1 indique qu'il s'agit du mode 40 colonnes, soit 320 points 
graphiques en largeur (8 points par colonne). 

La ligne 60 range la valeur 255 dans la variable CONTENU. Ce contenu, 
nous allons le placer dans toute la m6moire ecran grace a I'instruction 
POKE de la ligne 80 et £ la boucle I'encadrant. 

Apres RUN, vous constatez que tout I'ecran se remplit de blanc, point par 
point. Vous constatez aussi que les lignes successives de trace ne sont pas 
dans i'ordre : une ligne est remplie, puis une ligne un peu plus bas, ainsi de 
suite ; et le processus se reproduit ensuite a partir du haut de I'ecran, 



CARACTERISTIQUES GRAPHIQUES I 17 

decale d'une ligne. Nous verrons plus loin Texplication de ce phenomene. 
Pour I'heure, nous avons constate que, sans utiliser la moindre instruction 
graphique, nous avons rempli I'ecran point par point, en modifiant 
simplement le contenu de ia memoire ecran. 

Cette memoire, nous I'avons vu, occupe 16 Ko. La place n'est ni 
extensible, ni reducible. Quelle que soit la resolution choisie, I'ecran est 
toujours represent^ par ces 16 Ko, ni plus, ni moins. Pourtant, le mode ne 
permet de disposer que de 32 000 points (160 par ligne et 200 lignes), 
tandis que le mode 1 et le mode 2 possedent respectivement 64 000 et 
128 000 points. 



Mais il faut un certain nombre d'octets pour memoriser un point. A 
raison d'un octet par point, il faudrait 32 Ko de memoire uniquement pour 
■le mode 0, et 128 Ko pour le mode 2. Comment se contenter de ces 16 Ko 
pour avoir le meme nombre de points ? Vous avez pu remarquer, dans la 
documentation Amstrad, que le nombre de couleurs simultanees a I'ecran 
variait suivant le mode de resolution : 16 en mode 0, 4 en mode 1 et 
seulement deux en mode 2. Pourquoi ? 



Quel que soit le mode, nous venons de constater qu'on ne peut pas 
reserver un octet par point : il n'y a pas assez de memoire ecran. En 
revanche, nous pouvons coder plusieurs points par octet, en utilisant les 
bits (les debutants peuvent consulter I'annexe 8 pour se familiariser avec 
les octets, bits et autres notions binaires). II y a en effet 8 bits par octet. 

Si nous utilisons des groupes de 4 bits, nous pouvons stocker deux 
points par octet. Cela nous donne 16 000 octets utilises qui permettent 
effectivement de stocker 32 000 points. Mais dans ce cas, chaque informa- 
tion correspondant a un point est formee de 4 bits, ce qui autorise 16 
valeurs (2 exposant 4). En conclusion, il est possible de donner, dans ce 
cas, 16 valeurs differentes a un point. Nous avons done 160*200 points, et 
16 couleurs simultees. Les 16 couleurs sont representees par une valeur 
allant de a 15 en memoire ecran. 

En mode 1, nous divisons les octets par groupe de 2 bits, de fagon a 
stocker 4 points par octet. Deux bits permettent 4 valeurs differentes, nous 
ne pourrons done avoir que 4 couleurs simultanees a l'6cran. 

Enfin, en mode 2, un point est represents par un bit unique, ce qui ne 
permet que 2 valeurs distinctes, done 2 couleurs. 



18 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 

Le codage des points en memoire ecran 

Ces limitations sont plus ou moins genantes. En effet, il aurait ete tres 
agreabie de pouvoir disposer de 16 couleurs en 320*200 points, ce qui 
represente un bon compromis graphique. Mais dans ce cas, il aurait fallu 
consacrer 32 Ko de memoire a I'ecran, et il ne serait plus reste que 32 Ko 
pour les programmes au lieu de 48 Ko. L'affichage aurait ete plus lent 
puisqu'il y aurait eu deux fois plus d'informations a traiter. 

Dans une certaine mesure, la limitation a 2 couleurs en mode 80 
colonnes n'est pas genante : pour un jeu, ce mode n'est pas utilisable, et la 
couleur est inutile pour un traitement de texte. En mode 0, 16 couleurs sont 
suffisantes, et Ton peut choisir ces 16 couleurs dans I'eventail des 27 
disponibles. En jouant sur les demi-teintes et les nuances, on arrive a 
pallier le manque de points et on obtient tout de meme des graphismes 
honorables. Quant au mode 1, il est presque parfait pour les jeux plus 
textuels (jeux d'aventure entre autres), et il convient parfaitement aux 
applications graphiques plus professionnelles (histogrammes, camem- 
berts...) sur lesquelles nous reviendrons. 

Mais les choses ne sont pas aussi simples. Le circuit 6845 et le Gate Array 
g6rent 16 Ko de memoire 50 fois par seconde ! Pour 6viter les probldmes, 
le codage des points en memoire ecran a ete optimise. Vous avez deja 
constate lors de I'execution du programme 1.1 que les adresses succes- 
sives en memoire ne se suivaient pas sur I'ecran. En fait cela est du a une 
astuce technique qui permet de synchroniser plus facilement le balayage 
de I'ecran et le rafraichissement de I'ecran. Cette astuce evite, entre autres, 
la presence de traits noirs parasites lors des modifications de la memoire 
ecran. Elle donne une quality graphique et une proprete d'6cran remarqua- 
bles, mais nous verrons vite a quel point elle complique la tache du 
programmeur. > 

Le codage des points en memoire est lui aussi, passe a la moulinette de 
I'optimisation. En effet, les bits propres a chaque point code dans un octet 
de la memoire sont enchevetres (techniquement, on dit aussi qu'ils sont 
entrelaces). Si nous numerotons les bits d'un octet de 7 a (en partant du 
bit situe le plus a gauche, le plus significatif en terme binaire), voici ou sont 
situes les points, suivant le mode. 

D MODE : le point a gauche est stocke dans les bits 1,5,3 et 7 le point a 
droite dans les bits 0,4,2 et 6. 

□ MODE 1 : le point le plus a gauche dans les bits 3 et 7 puis 2 et 6, puis 1 
et 5. Le point le plus a droite dans les bits et 4. 

D MODE 2 : le point le plus a gauche dans le bit 7, puis dans les bits 
6,5,4,3,2,1 et le point le plus a droite dans le bit 0. 

Seul le mode 2 suit une certaine logique. Le mode 1 est quant a lui 
totalement anarchique, en apparence bien entendu (schema 1.2. v. p. 19). 



CARACTER1STIQUES GRAPHIQUES I 19 



Mode : 

1 octet = 2 points 



T 



T 



* 



o 



point de droite 



r 



7 



o 



point de gauche 



MODE 1 : 

1 octet = 4 points 



i 



n 











point de droite 



point de gauche 



MODE 2 : 

1 octet = 8 points 



^ point le plus a droite 



w 



^ point le plus & gauche 



Schema 1.2 



Les huit bits des octets en memoire ecran. 



20 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 

II est pourtant essentiel de se familiariser avec ces codages. En effet, une 
grande partie des operations sur I'ecran executees dans ce livre necessite 
cette connaissance. 

Prenons un exemple en mode 1. Les couleurs disponibles dans ce mode 
sont codees, en memoire ecran, en utilisant les valeurs d 3, soit les 
valeurs 00, 01, 10 et 11 en binaire. 

Si nous vouions allumer les quatre points d'un octet particulier (par 
exemple celui situe en CAOO hexa, que nous noterons desormais $CA00) 
dans les quatre couleurs successives, voici la marche a suivre. 

Le premier point est en couleur 00 : les bits 3 et 7 de I'octet devront done 
etre mis a zero. Le second point aura la couleur 01 : bit 2 a z6ro, bit 6 a un. 
Ensuite, nous devons mettre 1 au bit 1 et au bit 5 pour avoir la couleur 10 
au troisieme point, et enfin mettre les bits et 4 a un. Cela se resume en 
une instruction Basic : 

POKE &CA00,&X01Q10Q11 

Si vous effectuez cette instruction, un petit amalgame apparait sur 
l'6cran. Les points sont trop proches pour qu'on puisse veritablement le 
constater, mais il y a effectivement un point de la couleur (le fond, done 
on ne le voit pas !), un autre en couleur 1, puis en couleur 2, puis en couleur 
3. Tout cela en un seul octet. 

La manipulation, pour le moins complexe, ddcrite ci-dessus vous donne 
un apergu des problemes de programmation entrames. Et encore ne 
s'agissait-il que d'un octet. Le programme 1.2 realise un remplissage 
selectif de I'ecran, suivant vos directives. 



IS ' ******************** 

20 '** Programme 1-2 ** 

30 ' ******************** 

40 ' 

50 FOR i=0 TO 3: INK i,i*5:NEXT 

60 MODE Is REM mode 320x200, 4 couleurs 

70 DIM point (3) , puissance (7) 

80 'memorisation des puissances de 2. 

90 FOR bit=0 TO 7: READ puissance (bit) : NEXT bit 

100 DATA 1,2,4,8,16,32,64,128 

110 ' 

120 'choix des couleurs des quatres points 

130 ' 

140 FOR p=0 TO 3 

150 PRINT "Point numero";p 

160 INPUT "Couleur (0 a 3) ";point(p) 

170 NEXT p 

180 ' 



CARACTtRISTlQUES GRAPHIQUES I 21 

190 'calcul de 1 'octet representant ces 4 paints 

200 ' 

210 FOR p=0 TO 3 

220 READ bitl ,bit2:REM numero des bits du point 

230 'poids -fort de la couleur dans le premier bi 

t 
240 contenu=contenu+puissance (bitl) * INT (point (p) 

/2) 
250 'poids -faible de la couleur dans le second b 

it 
260 contenu=contenu+puissance <bit2) * (point (p) AN 

D 1) 
270 NEXT p 

280 DATA 3,7,2,6,1,5,4,0 
290 ' 

300 'remplissage de la memoirs par ce contenu 
310 ' 
320 CLS 

330 FOR adresse=8/.C000 TO &FFFF 
340 POKE adresse , contenu 
350 NEXT adresse 



Le plus gros du travail est effectue entre les lignes 200 et 270, ou le choix 
de I'utilisateur est transforme en octet. Cette transformation suit les 
principes expliques plus haut, concemant le codage en mode 1. 

Lorsque nous aurons a gerer ces structures complexes de bits dans des 
routines en langage machine, il va de soi que nous devrons optimiser leur 
traitement. En rdgle generate, les routines travailleront en mode 0, ce qui 
assure une gestion plus simple qu'en mode 1 (ii n'y a que deux points par 
octet dans ce mode, rappelons-le). Le choix du mode assure, outre une 
gestion moins lourde des graphismes, un choix de couleurs acceptable. 



Couleurs et stylos 



Nous I'avons expliqu6 plus haut, un circuit special de I'Amstrad, le Gate 
Array, est charge de fournir les 27 nuances de couleurs au 6845. II est 
toutefois impossible d'obtenir ces 27 teintes simultanement a I'dcran, 
puisque dans le meilleur des cas (en mode 0), chaque point de I'ecran est 
programme par une valeur choisie parmi 16 differentes. 

II faut done, pour utiliser les couleurs voulues, creer une table de 
correspondance entre chaque code (de a 15 en mode 0, de a 3 en mode 
1, et de d 1 en mode 2) et chaque numero de teinte (de a 26), afin de 
savoir quelle est la teinte representee par chaque code de la memoire 
6cran. 



22 I GRAPHEMES EN ASSEMBLEUR SUR AMSTRAD 

Sous controle du Basic, cette table est modifiee par I'instruction INK. Un 
equivalent existe en langage machine, soit sous la forme d'une instruction 
du systeme d'exploitation, soit en programmant directement le Gate Array 
(plus rapide, mais egalement plus obscur). 

A la mise en marche de I'Amstrad, I'ecran est place en mode 1 et les 
couleurs suivantes sont assignees : 

- code : couleur 1 (bleu fonce) ; 

- code 1 : couleur 24 (jaune vif) ; 

- code 2 : couleur 20 (bleu pale vif) ; 

- code 3 : couleur 6 (rouge clair). 

Si vous tapez alors I'instruction INK 1,0, vous reprogrammez le Gate 
Array afin qu'il affiche la couleur (noir) pour les points de la memoire 
ecran contenant le code 1. De jaune, les textes passeront alors imrnediate- 
ment au noir. 

Ce principe de table de correspondance est vital lui aussi. De fagon 
generale, vous pouvez considerer que le code situe en memoire ecran pour 
un point donne est le numero d'un stylo avec lequel il a ete trace. Ce stylo, 
vous pouvez a tout moment en changer la couleur d'encre. Tout ce qui, sur 
I'ecran, a ete trace avec ce stylo subira immediatement la modification. 

Les stylos sont un ieger obstacle pour la comprehension, mais ils ont 
d'enormes avantages. lis permettent notamment d'utiliser la totalite des 27 
couleurs dans un jeu, suivant les tableaux ou les situations representees, 
en reprogrammant, au choix, les stylos disponibles pour utiliser des teintes 
quelconques. Dans tel tableau, le rouge sera utilise pour le stylo 1, dans un 
autre ce sera le bleu. 

II est notamment possible d'obtenir des effets de mouvement gSometri- 
ques facilement grace aux stylos. Le programme 1 .3 est une application de 
ce procede. 



1 ' ******************** 

20 '** Programme 1.3 -*-* 

3® * ******************** 

40 ' 

50 MODE i:DEFINT a-z 

60 ' 

70 'tons les stylos en pale 

80 ' 

90 FOR stylo=l TO 3: INK styio,i'3: NEXT stylo 

100 ' 

110 'trace invisible des ellipses 

120 ' 

130 LOCATE l,20:PRINT H Patientez SVP. - . " 

140 stylo=l 



caract£ristigues GRAPHIQUES I 23 

150 FOR rayon=10 TO 100 STEP 5 

160 DEG 

170 MOVE 320+rayon+30,200 

180 FOR an=0 TO 3&0 STEP 8 

190 DRAW 320+COS<an)*(rayan+30) ,200+SIN (an) *ra 

yon , stylo 
200 stylo=stylo+l: IF 5tylo=4 THEN stylo=l 
210 NEXT 

220 LOCATE 1,24: PRINT INT ( (100-rayon) /5) 
230 NEXT 

240 LOCATE 1,24: PR I NT" 

250 LOCATE 1,20: PRINT STRING* (20,32) ; 
260 * 
270 ' mouvement simule par modification des coule 

urs 
280 ' 

290 INK 1,20: INK 2,10: INK 3,0 
300 FOR K=l TO 300: NEXT 
310 INK 1,10: INK 2,0: INK 3,20 
320 FOR K=l TO 300: NEXT 
330 INK 1,0: INK 2,20: INK 3,10 
340 FOR K=l TO 300: NEXT 
350 GOTO 290 



INSTRUCTIONS GRAPHIQUES 



Organisation Interne 

Ce programme introduit les premieres instructions graphiques : PLOT et 
DRAW. A ce niveau, I'Amstrad, malgre deux ou trois omissions regretta- 
bles, n'a rien a envier & la plupart des machines. 

Une particularite interne singularise I'Amstrad : l'interpr§teur Basic, 
dans la majority des cas, n'execute aucune instruction de gestion de la 
machine. Par exemple, les instructions graphiques sont toutes int§gr6es au 
systdme d'exploitation et non a I'interpr6teur. Dans ce cas, le Basic se 
contente d'appeler le systeme d'exploitation. Cette fagon de proc6der 
differe radicalement des autres ordinateurs familiaux : elle ressemble plus 
a un materiel professionnel. Bien que, theoriquement, cela ralentisse 
I6g6rement l'ex6cution des programmes (ce n'est sensible qu'au niveau 
machine), il en r6sulte une facility de programmation en langage machine 
assez exceptionnelle, puisque toutes les instructions graphiques sont 
disponibles sous la forme d'un CALL simple. Toutefois, ces instructions 
seront peu utilisees pour la programmation de jeux rapides, en raison de 



24 I GRAPHEMES EN ASSEMBLEUR SUR AMSTRAD 

leur lenteur. Elles sont cependant tres interessantes pour la realisation de 
camemberts, histogrammes. Nous y reviendrons. 



Le systeme de coordonnees 

Avant de nous approcher des instructions Basic disponibles, il nous faut 
examiner le systeme de coordonnees retenu pour I'ecran. A ce niveau 
encore, les concepteurs de I'Amstrad ont adopte une attitude originale. En 
effet, quelle que soit la resolution choisie, I'ecran est represente par les 
coordonnees a 639 (sur I'axe horizontal) et a 399 (pour I'axe vertical). 
Cela, meme si vous n'avez que 160 x 200 points. 

Cette singularity obscurcit serieusement les premiers pas en Basic : en 
effet, le point (0,0) est toujours, quel que soit le mode choisi, celui situe 
dans le coin inferieur gauche de I'ecran, et (639,399) dans le coin superieur 
droit. En revanche, le point (3,0) est le meme que (0,0) en mode 0, il est 
situe juste a cote de (0,0) en mode 1, et il est situe a trois points de (0,0) en 
mode 2 ! 

Pour simplifier cette organisation, nous allons introduire quelques 
definitions. 

Nous appellerons point logique un point dont les coordonnees sont 
representees par les coordonnees (0,0) a (639,399). En revanche, nous 
designerons par point physique un point unique sur I'ecran, existant 
reellement. En mode 0, les points physiques auront les coordonnees (0,0) a 
(159,199). En mode 1, cesera (0,0) a (319,199) et (0,0) a (639,199) en mode 2. 

II y a 8 points physiques pour un point logique en mode 0,4 en mode 1,et 
2 en mode 2 (schema 1.3) 



i multiple de 4, j multiple de 2 



I j+1) 



(i, j) 



:i+ij+i 



(i+1, i) 



(i+2J+1 



H2, j) 



:i+3,j + 1> 



|i+3, j) 



^ MODE : 8 points logiques 



'■»■ »».... .*.*.*.*.*.*.'.*.*.*.i 



^ MODE 1 : 4 points logiques 



wmm 



^. MODE 2 : 2 points logiques 



Schema 1.3 



Les points graphiques logiques 



CARACT£R!STIQUES GRAPHIOUES I 25 

Le point physique (0,0) correspond en effet aux points logiques sui- 
vants : 



D MODE 
□ MODE 1 
D MODE 2 



[O f 0)AQS)A'\,Oh('l,'\),(2 l O) t (2,'\)A3,0) l (3.'\): 

(0,0),(0,1),{1,0),<1,1); 

(0>0),(0,1}. 



Les instructions graphiques de I'Amstrad utilisent toutes les coordon- 
nees de points logiques. Certaines doivent disposer des coordonnees des 
points, d'autres travaillent a partir du nombre de points. Dans ce cas, il faut 
compter le nombre de points logiques et non physiques. 

Les instructions et fonctions graphiques 



Les plus importantes instructions Basic sont PLOT, DRAW, MOVE ainsi 
que PLOTR, DRAWR et MOVER. II y a egalement les fonctions XPOS et 
YPOS ainsi que TEST et TESTR. Nous allons etudier leur fonctionnement. 

□ PLOT est Instruction commune a toutes les machines : eile permet de 
modifier la couleur d'un point logique de I'ecran. Par exemple, "PLOT 
319,199,1" donne la couleur du stylo 1 au point situe au milieu de 
I'ecran. Petit rappel : quel que soit le mode de resolution choisi, 
(319,199) est en effet au milieu de I'ecran, puisque les coordonnees vont 
de (0,0) a (639,399). En revanche, si vous effectuez cette instruction dans 
les trois modes, vous pouvez aisement constater que la taiile du point 
differe. Pour etre precis, le point garde la meme hauteur mais il est deux 
fois moins large en mode 1 qu'en mode 0, et deux fois moins en mode 2 
qu'en mode 1. 

D DRAW trace une droite dans une couleur donnee jusqu'a un point 
indique, cela a partir du dernier point trace. Ainsi, apres le PLOT ci- 
dessus, "DRAW 0,0,2" trace une droite du milieu de l'6cran au coin 
inferieur gauche, cela dans la couleur du stylo 2. 

L'omission du numero de stylo provoque I'utiiisation du dernier stylo 
utilise pour un trace graphique. Cette particularity discrete permet d'opti- 
miser la taiile des instructions graphiques dans les programmes Basic : en 
effet, il suffit, avant tous les traitements dans une couleur donnee, de 
positionner le stylo utilise par un PLOT "bidon", par exemple "PLOT 
800,800,stylo". Le point (800,800) n'est pas sur I'ecran, il n'est done pas 
allume, mais la couleur est bel et bien selectionnee. Ensuite, on omettra 
volontairement le numero de stylo derriere les instructions graphiques. 

□ MOVE est un peu Equivalent de PLOT, mais sans trace : il permet de 
positionner le curseur graphique (coordonnees du dernier point trace) 
sur n'importe quel point de I'ecran. Effectuez par exemple les deux 
sequences suivantes pour constater la difference (schema 1.4 v. p. 26). 



26 I GRAPHEMES EN ASSEMBLEUR SUR AMSTRAD 



SEQUENCE 1 : 



© 



PLOT 319,199,1 



MOVE 0,0 




SEQUENCE 2 : 



© 









PLOT 319,199,1 






S> 


DRAW 100,100 







Schema 1.4 



MOVE et DRAW. 



Sequence 1 

MODE 1 
PLOT 319,199,1 
MOVE 0,0 
DRAW 100,100 



Sequence 2 

MODE 1 
PLOT 319,199,1 
DRAW 100,100 



□ PLOTR, DRAWR et MOVER correspondent exactement a PLOT, DRAW et 
MOVE, mais au lieu des coordonnees d'un point cible, c'est un 
deplacement qui est utilise. Pour I'illustrer, voici a nouveau deux 
sequences, relativement identiques, d'effet pourtant bien different. 



Sequence 1 

MODE 1 
PLOT 319,199,1 
DRAW 100,100,2 



Sequence 2 

MODE 1 
PLOT 319,199,1 
DRAWR 100,100,2 



caractEristiques GRAPHIQUES I 27 

D XPOS et YPOS : ces fonctions renvoient la valeur du curseur graphique. 
Si vous effectuez "PRINT XPOS, YPOS" apres les deux sequences 
precedentes, vous obtiendrez les valeurs suivantes : 100 100 pour la 
premiere sequence, 419 299 pour la seconde. 

□ TEST (x,y) : cette fonction renvoie le numero de stylo correspondant a la 
couleur du point indique. 

D TESTR fonctionne comme TEST, mais le point a tester est exprime en 
nombre de points le separant de la position actuelle du curseur. 



Utilisation des instructions et des fonctions 



Dans la pratique, ces fonctions et instructions graphiques ne sont guere 
utilisees en langage machine, sauf par exemple pour la mise en place de 
decors particulierement geometriques. Mais elles sont beaucoup trop 
lentes pour autoriser une exploitation efficace dans un jeu d'action rapide. 
En revanche, elles ont une qualite non negligeable : elles ignorent les 
erreurs sans perturber le fonctionnement des programmes. Mieux, les 
coordonn^es sont toujours prises en compte, meme si elles sortent de 
I'ecran. Enfin, la plus grande qualite de ces instructions est leur fonctionne- 
ment par systeme de coordonnees. Les instructions du systeme d'exploita- 
tion qui leur sont associees utilisent le meme systeme, et cela reste 
essentiel pour realiser des graphismes a base de motifs geometriques. 

Ainsi, vous constaterez aisement que "PLOT 0,0,1" suivie de "DRAW 
800,800" trace une droite traversant I'ecran, bien que (800,800) soit 
logiquement en dehors de celui-ci. La droite generee est pourtant celle qui 
rejoindrait effectivement (800,800) si celui-ci existait (schema 1.5). 

(800,800) 

7 



400 



SPLOT 0,0,1 
DRAW 800,800 



ECRAN 
SIMULE 
(VIRTUEL) 
/ 



/ 



ECRAN 

AFFICHE 

(REEL) 



640 



Schema 1.5 



Depassement de I'&cran. 



28 I GRAPHiSMES EN ASSEMBLEUR SUR AMSTRAD 

Tout au long de ce chapitre, vous avez pu vous familiariser avec la 
structure de I'ecran et son traitement en Basic, bien que nous soyons 
volontairement restes proches de la machine. II est toutefois evident que le 
Basic ne permet pas la realisation de jeux rapides, quels qu'ils soient. Pour 
mettre en evidence la sup^riorite du langage machine, il suffit d'ex6cuter 
chacun des programmes concluant ce chapitre et d'en tirer les conclusions 
qui s'imposent (programmes 1.4 h 1.7). Nous avons egalement pris 
connaissance des instructions graphiques de base, instructions que nous 
utiliserons plus loin afin de r£a!iser des utilitaires de trace de figures. Nous 
reviendrons sur ces fonctions lors de la realisation des trois routines dans 
le chapitre 3. 



10 


" ******************** 








20 


'** Programme 1 


- 4 ** 








30 


' ******************..*# 








40 


'duree 42982 ( ! 


> 








50 
60 


remplissage de 


1 'ecran 


BASIC 


par points 


70 


MODE 1 










80 


DEFINT a-y:REM pour aller tres 


vite 




90 


PLOT 800,800, 1 


'selectionne le 


stylo 


graphiqu 


100 


z=TIME 










110 


FOR y=0 TO 399 


STEP 2 








120 


FOR >;=0 TO 639 


STEP 2 








130 


PLOT x,y 










140 


NEXT x 










150 


NEXT y 










160 


FRINT "Duree = ' 


' ;TIME-z 









10 ' ******************** 

20 '** Programme 1.5 ** 

30 ' ******************** 

40 duree 8086 

50 'remplissage de I'ecran BASIC par acces memoi 

re ecran 
60 ' 

70 MODE 1 

80 DEFINT a-y:REM pour aller tres vite 
90 co=&Xl 11 10000 
100 z=TIME 

110 FOR ad=&C000 TO &FFFF 
120 POKE ad, co 
130 NEXT ad 
140 PRINT "Duree =";TIME-z 



CARACTERISTIGUES GRAPHIQUES I 29 



10 





20 jreraplissage 


ecran LM par point 






30 ;en utilisant PLOT (programme 1. 


6 




40; 








8BEA 


50 PLOT: 


EDU 


ftBBEA 




BBDE 


60 INK: 
70; 


EQU 


ttBBDE 




4800 


80 


ORB 


#4000 




4000 3E01 


9fl 


LD 


A,l 




4002 CDDEBB 


100 


CALL INK 






110 ; 








4005 219001 


120 
130 ; 


LD 


HL,400 




4008 11B002 


140 KJUO.il 


LD 


DE,640 




400B F5 


150 B0UCL2: 


i PUSH AF 




400C D5 


160 


PUSH DE 




400D ES 


170 


PUSH HL 




400E CDEABB 


180 


CALL PLOT 




4011 El 


190 


POP 


HL 




4012 Dl 


200 


POP 


DE 




4013 Fl 


210 


POP 


AF 




4014 IB 


220 


DEC 


DE 




4015 IB 


230 


DEC 


DE 




4016 F5 


240 


PUSH AF 




4017 D5 


250 


PUSH DE 




4018 E5 


260 


PUSHHL 




4019 CDEABB 


270 


CALL PLOT 




401C El 


280 


POP 


HL 




401D Dl 


290 


POP 


DE 




401E 7B 


380 


LD 


A,E 




401F B2 


310 


OR 


D 




4020 CA2740 


320 


JP 


Z,FIN2 




4023 Fl 


330 


POP 


AF 




4024 C30B40 


340 
350 ; 


JP 


B0UCL2 




4027 2B 


360 FIN2: 


DEC 


HL 




4028 2B 


370 


DEC 


HL 




4029 7D 


388 


LD 


A,L 




402A B4 


390 


OR 


H 




402B CA3240 


400 


JP 


Z,FIN1 




402E Fl 


410 


POP 


AF 




402F C30840 


420 
430 ; 


JP 


B0UCL1 




4032 Fl 


440 FIN1: 


POP 


AF 




4033 C? 


450 


RET 






Pass 2 errors: 


00 









;adresse routine PLOT 
jadresse selection stylo 
graphique 



;positionne couleur dans AF 

; tout es les lignes 

;tous les points de la ligne 



;x=x-2 



; teste la -fin de la boucle 
;f in de la ligne en cours 
jrecupere encre 
;continue la ligne 



jy=y-2 

; teste fin de boucle 
j-fin du reraplissage 
jrecupere encre 



;remet pile en etat 
j-fin 



30 I GRAPHEMES EN ASSEMBLEUR SUR AMSTRAD 



10 '*****+************** 

20 '** Programme 1.6 ** 

30 * ******************** 

40 'duree 21065 

50 'remplissage de 1 'ecran LM par points 

60 ' 

70 MODE 1 

B0 MEMORY &3FFF 

90 DEFINT a-y:REM pour alier tres vite 

100 AD=&4000 

110 READ c:IF c=-l THEN 140 

120 POKE ad,c:ad=ad+l:60Tu 110 

130 DATA 62,1,205,222,187,33,144,1,17,128,2,245, 
213,229,205,234,187,225,209,241, 27,27,245,21 
3,229,205,234,187,225,209,123,178,202,39,64,2 
41,195,11,64,43,43,125,180,202,50,64,241,195, 
8,64,241,201,-1 

140 z=TIME 

150 CALL &4000 

160 PRINT "Duree =";TIME-z 



4000 2100C0 
0EF0 



10 I 

20 jremplissage ecran LM par acces memoire ecran 
30 ; (programme 1.7) 
40 ORG #4060 

50 ; 

60 LD HL,ttC000 ; debut memoire ecran 

70 LD C f Xl 11 10000 ; masque pour quatre pts 

en couleur 1 



4005 71 


90 LOOP: 


LD 


(HL),C 


4006 23 


100 


INC 


HL 


4007 7C 


110 


LD 


A,H 


400S B5 


120 


OR 


L 


4009 C20540 


130 


JP 


NZ,LQ0P 


400C C9 


140 


RET 





jremplissage octet 
; octet suivant 

;a t'on depasse JtFFFF ? 

;non:continuer 

;fin du travail 



Pass 2 errors: 00 



10 '*****.***♦**********# 

20 '** Programme 1.7 ** 

30 * ******************** 

40 'duree 57 

50 'remplissage de 1 'ecran LM par acces memoire 

ecran 
60 ' 

70 MODE 1 
80 MEMORY &3FFF 

90 DEFINT a-y:REM pour aller tres vite 
100 AD=&4000 

110 READ cs IF c=-l THEN 140 
120 POKE ad,c:ad=ad+l:GOTO 110 

130 DATA 33,0,192, 14,240,113,35,124, 181, 194, 5,64 
,201,-1 

140 z=TIME 

150 CALL &4000 

160 PRINT "Duree =";TIME-z 



UTILISATION - 
DU LANGAGE MACHINE 2 

SOUS BASIC 



32 i GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 

ASSEMBLEUR ET LANGAGE MACHINE 
Definitions 

Le processeur principal de I'Amstrad est un Z-80. Malgre son age, ce 
micro-processeur accomplit brillamment sa mission, gerant notamment 
96 Ko de memoire aiors que son champ d'adressage se limite a 64, plus 
rapidement que sur les machines concurrentes dotees de 64 Ko. 

II va sans dire que pour obtenir de telles performances, les concepteurs 
de I'Amstrad ont du recourir a nombre d'astuces. Celles-ci facilitent la tache 
du processeur, mais pas toujours celle du programmeur, nous le consta- 
terons souvent a nos depens. 

L'obstacle qui surgit d'emblee lors des premiers pas en assembleur est 
justement celui de la definition. Quelle est la difference entre I'assembleur 
et le langage machine ? II n'y en a pas a proprement parler. II s'agit bien 
d'une nuance de definition. Le seul langage compris parun processeur est 
son langage machine. Ce langage est constitue d'instructions operant sur 
des registres, des adresses memoires, ou des lignes de peripheriques. 
Dans tous les cas, ces instructions sont des nombres. Le stockage de 
donnees et des programmes s'effectuant en binaire, il faut done se 
resoudre a I'evidence : les seuis programmes executables par le proces- 
seur sont constitues d'une suite de et de 1. Fort heureusement, les 
constructeurs de processeurs n'en sont pas restes la. Constatant les 
difficultes de programmation en binaire, ils ont associe, a chacune des 
instructions du processeur, un mnemonique, un nom propre qui en facilite 
la comprehension et la memorisation. Par exemple, sur le Z-80, Instruc- 
tion qui charge le contenu du registre B dans le registre A se materialise par 
le nombre $78 (ou 01111000 en binaire, tel qu'il est effectivement stocke en 
memoire) qui est devenu "LD A,B". Toutes les instructions ont ainsi regu 
un nom. Nous pouvons maintenant introduire les deux definitions : 

— le langage machine est I'ensemble des instructions du processeur sous 
forme numerique (en binaire, hexadecimal ou decimal) ; 

- le langage assembleur est ('ensemble des noms. 

Le langage assembleur a une fonction de mise au point : il est beaucoup 
plus clair de lire "LD A,B" dans un programme que "01111000". Les 
sources d'erreurs (par inattention surtout) sont d'autant reduites. Mis & part 
ce point de detail, il est theoriquement equivalent au langage machine. 
Toutefois, stocker "01111000" dans une case memoire est facile. Mais que 
faire de "LD A,B" ? 

Avant ('invention des programmes assembleur, la seule solution etait la 
suivante : le programmeur programmait ses routines grace aux mnemoni- 
ques, puis prenait chaque instruction de son programme et la traduisait en 
langage machine. Ensuite, il rentrait la liste des nombres obtenus en 
memoire. Un programme assembleur a pour but d'effectuer ce travail. 



UTILISATION LANGAGE MACHINE I 33 

Des lors, le programmeur se retrouve avec un langage facile a memori- 
ser (en comparaison du langage machine) et a pratiquer. Programmer en 
langage d'assemblage revient a programmer en langage machine : la 
frontiere qui separe les deux langages est entierement abolie par le 
programme assembleur. 

Par abus de langage, le terme assembleur a fini par representer tout a la 
fois : le langage machine, le programme assembleur, et meme le langage 
d'assemblage. 

Ne vous etonnez done pas de rencontrer indifferemment les termes 
langage machine et assembleur dans la suite de I'ouvrage. lis sont de nos 
jours synonymes. 

Chaque processeur, a I'image d'un interpreteur Basic, possede ses 
particularites et ses instructions. L'ensemble des instructions forme done 
ce que Ton appelle le langage machine. Dans I'essentiel, il s'agit destruc- 
tions plutot primitives, ne sachant pas faire grand chose. Pourtant, tout ce 
qui peut etre fait sur I'Amstrad Test dans ce langage. II faut done croire que 
le langage machine, sous son apparente rusticite, represente une reelle 
puissance. 



Puissance et vitesse 

La puissance du langage machine vient de deux facteurs. Sa vitesse de 
traitement, tout d'abord. Vous avez pu constater, au chapitre precedent, 
qu'un simple programme consistant k remplir 16 Ko de memoire avec une 
valeur donnee s'executait 142 fois plus vite en langage machine (nous 
I'appellerons desormais LM) qu'en Basic. Meme lorsque le Basic etait tres 
proche du LM (lors du remplissage de I'ecran point par point), le LM 
s'executait tout de meme deux fois plus rapidement. 

Deuxieme facteur important dans le langage machine : sa compacite. Le 
programme 1.1, variables comprises, occupait 143 octets. Son equivalent 
LM (programme 1.7) n'en necessite que 13. 

Enfin, outre ces deux facteurs, il est un troisieme avantage plus discret : 
en programmant en LM on accede simplement a toutes les ressources de la 
machine. C'est dire qu'en LM, rien n'est impossible, dans la mesure ou Ton 
connait les limites materielles du possible. Evidemment, on ne fera jamais 
afficher 28couleurs a I'Amstrad : il n'en a que 27 par construction ! 

Par contre, pour mettre en evidence la puissance du langage machine, il 
est parfaitement possible d'afficher plus de 16 couleurs differentes sur un 
meme ecran, en modifiant les couleurs des stylos en LM d'une certaine 
fagon. En effet, il est parfaitement possible d'executer un tel changement 
de couleur sans que le balayage de I'ecran ne soit totalement fini. Le 
balayage commence alors que le stylo possede une certaine couleur. 
Arrive par exemple au milieu de I'ecran, si le stylo change de couleur, le 



34 l GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 

balayage se terminera avec cette nouvelle couleur. Comme vous le 
constatez, le LM repousse bien loin les limites expliquees dans la 
documentation Amstrad. 

Toutefois, le LM possede un inconvenient enorme : it s'agit, a I'heure 
actuelle, du langage le plus difficile d'acces, bien qu'il ne soit pas le plus 
difficile a pratiquer. Alors que tous les autres langages (Basic, Pascal, C, 
Ada, Forth, etc.), se pretent bien a un apprentissage en douceur, le LM 
s'apprend tres differemrnent. En 1'occurrence, les debutants apprennent 
vite a connaitre les instructions du Z-80 (ou d'un autre processeur), mais ils 
se heurtent inevitabiement a un mur apparemment infranchissable des 
qu'ils tentent de les pratiquer. La perseverance et la patience aidant, au 
bout d'une periode variable, le debutant a 1'impression penible de patiner 
sur place, et, soudain, le mur s'ecroule, et tout devient clair. Le program- 
mer a alors 1'impression que rien ne peut plus lui resister. 

La raison de cette sensation est la puissance et la polyvalence meme du 
LM. Comme explique plus haut, tout est possible en LM. 



LES OUTILS DU PROGRAMMEUR 



Pour attaquer le LM, il faut des outils. Comme il en existe beaucoup, 
chacun fait son choix une bonne fois pour toutes. Une fois ces outils 
choisis, le programmeur y sera si attache qu'il ne fera rien pour en avoir de 
plus puissants ou de plus complets. L'essentiel reste de bien connaitre ses 
outils. 

Voici les outils du programmeur LM : 

- un livre d'initiation au langage machine Z-80, mettant en evidence les 
pieges grossiers du processeur, dans lesquels meme le plus experiments 
des programmeurs peut tomber par inattention ! Nous vous recomman- 
dons particulierement Programmer en assembleur d'Alain Pinaud (publie 
aux editions du P.S.I.). Bien qu'assez ancien, ce livre reste le meilleur de sa 
categorie, de loin, et possede une table complete des instructions Z-80 ; 

- un livre de reference sur le Z-80. Cet achat sera le plus onereux, mais pas 
le moins utile. II en existe quelques-uns, dont la bible, a savoir Programma- 
tion du Z-80 de Rodnay Zaks, chez Sybex. Au debut, il ne sera toutefois pas 
utile, mais son besoin se fera sentir lorsque vous en viendrez a calculer le 
temps d'horloge demande par une routine pour I'optimiser et accelerer son 
execution ; 

- un assembleur. Pour I'Amstrad, DEVPAC est sans doute I'un des 
meilleurs en raison des possibilites d'inclusion defichiers externes. Mais la 
aussi, il existe plusieurs assembleurs dignes d'interet, sans que Ton puisse 
affirmer a 100% lequel est le meilleur. Certains preferent DAMS, d'autres 
ZEN. L'essentiel est de bien connaitre les possibilites de son assembleur, le 
reste est affaire de gout; 



UTILISATION LANGAGE MACHINE I 35 

- un debugger/desassembleur. Un tel outil permet par exemple d'execu- 
ter un programme instruction par instruction, ce qui est parfois utile pour 
trouver une erreur. Les assembleurs recents (lis le sonttous sur la machine 
qui nous interesse) possedent un debugger integre ou separe compatible 
avec I'assernbleur ; 

- si possible, un lecteur de disquettes. Le besoin ne se fera pas trop sentir 
pour les routines du livre, toutefois le programmeur realisant ses propres 
programmes craquera vite s'il doit recharger I'assernbleur a chaque fois 
que son programme plante I'ordinateur. II va de soi que I'achat d'un lecteur 
de disquettes represente un certain investissement, mais de nos jours cet 
investissement est vite amorti. Si vous poss6dez un 664 ou un 6128, il va 
egalement de soi que notre remarque devient caduque ! 

- des que possible, et meme avant le lecteur de disquettes, une impri- 
mante. Programmer en assembleur sans imprimante est acceptable si les 
routines ne d6passent pas deux pages ecran. Au-dela, cela frole le suicide. 
Ceux qui ne possedent pas d'imprimante en subissent les consequences, 
c'est-&-dire qu'ils sont leur propre imprimante. En clair, lorsqu'il y a une 
erreur, ils recopient le programme a la main sur papier pour y voir clair ; 

- concernant I'Amstrad, il existe trois documentations essentielles. On 
juge trop souvent les micro-ordinateurs par leurs performances techniques 
ou les logiciels disponibles. Mais ces elements, au contraire, sont secon- 
dares. Ce qui compte le plus, c'est la documentation disponible et sa 
qualite. Hormis le manuel du constructeur, qui ne suffit pas des que Ton 
attaque le LM, trois ouvrages tres facile a trouver sont a acheter au meme 
titre que le programme assembleur. CPC 464 FIRMWARE, publie par 
Amsoft, resume la totalite des particularites du logiciel interne de I'Ams- 
trad. II a ete ecrit par I'un des auteurs de ce logiciel, ce qui est une 
assurance inegalable. Et non seulement ce manuel dit tout, mais il est 
extremement bien organise, ce qui ne gache rien. Si vous rechignez a vous 
procurer ce gros classeur en langue angfaise, P.S.I, a publie Clefs pour 
I'Amstrad qui est un excellent condense sur I'Amstrad. Tout y est, bien 
range, facilement accessible, mais attention : ce livre sera surtout utile a 
ceux qui auront lu le Firmware. Clefs est au Firmware ce que le dictionnaire 
est a I'encyclopedie ; 

- enfin, Micro-application a traduit la bible du programmeur de I'Amstrad, 
qui est un horrible fouillis, mais qui explique en long, en large et en travers 
tout ce qu'Amstrad n'a pas voulu dire. La programmation directe des 
circuits y est notamment dissequee, et le livre comporte le listing de la 
totalite du logiciel interne du CPC 464. Attention, cet ouvrage n'est pas 
facilement assimilable, il est en tout cas inutile pour ceux qui veulent se 
familiariser avec le Z-80 ! Mais il sera une aide inegalee pour ceux qui 
veulent fouiller leur Amstrad en LM, par exemple pour detourner des 
routines systeme ou travailler directement avec le 6845 ! 



36 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 



PROGRAMMATION DU Z-80 



Le processeur 



Le Z-80 possede sa propre philosophie. Sa programmation passe 
principalement par une utilisation appropriee des bons registres aux bons 
moments. Le nombre de registres du Z-80 est en effet assez eleve, ce qui 
est un enorme avantage par rapport a la majorite des autres processeurs 
8 bits (schema 2. 1). 



H 


L 


D 


E 


B 


C 



REGISTRES DE TRAVAIL 
16 bits HL,DE,BC 
8 bits H,L,D,B,C 



REGISTRE DE CALCUL 
8 bits A 
16 bits AF 



REGISTRE D'ETAT 
8 bits F 
16 bits AF 



IX 



IY 



i 



REGISTRE D'INDEXATION 
16 bits IXJY 



pc 



sp 



I 



REGISTRES DE CONTROLE 
16 bits PC 
SP 



REGISTRE D'INTERRUPTION 
8 bits I 



REGISTRE DE RAFRAICHISSEMENT 
8 bits R 



UTILISATION LANGAGE MACHINE I 37 



H' 


L' 


D' 


E' 


B' 


C 


A' 


F' 



REGISTRES SECONDAIRES 

16 bits hl,de;bc;af' 



Schema 2.1 



Les registres du processeur Z-80. 



En revanche, les possibilites d'acces a la memoire (que Ton regroupe 
sous I'appellation de modes d'adressage) sont moins etenduos qu'on ne le 
voudrait. De plus, bien que le nombre destructions soit assez impression- 
nant, il en manque certaines que tout debutant a pourtant tendance a 
inventer, ce qui conduit inevitablement a une erreur d'assemblage et done 
a une correction de I'instruction, pas toujours evidente. Mais dans 
I'ensemble, I'experience des defauts vient avec la pratique. 

Les registres du Z-80 sont tous de type 8 bits, sauf quatre registres 16 bits 
utilises h des fins tres particulieres. Toutefois, certains des registres 8 bits 
peuvent etre traites par paire pour former des registres 16 bits, par 
exemple pour traiter des adresses. 

Le Z-80 possede d'autre part un second jeu de registres, que Ton peut 
echanger contre le jeu principal. Cela est utile pour sauver facilement les 
registres avant d'entamer un travail provisoire. Ces registres sont d'ailleurs 
utilises sur I'Amstrad lors des interruptions. Malheureusement, ceci en 
interdit i'emploi pour la programmation, a moins de detourner les 
interruptions - ce qui sort largement du cadre de cet ouvrage. La 
documentation Amstrad Firmware indique d'ailleurs comment proceder. II 
est dommage que la modification n'ait pas ete prevue a I'origine, car les 
registres secondaires ne sont pas toujours inutiles. Qa ne devrait toutefois 
pas etre un probleme pour les debutants, s'ils apprennent le Z-80 en ne les 
utilisant pas. 



Les registres 8 bits 



Les registres 8 bits les plus utilises sont de loin A et F. A est le registre 
"accumulateur". II regoit les resultats des instructions de calcul du Z-80 
(addition, soustraction, rotations de bits, operations logiques, etc.). F est 
son associe : il resume le resultat de I'operation sous la forme de drapeaux. 
II y a par exemple le drapeau Z qui est leve si le resultat est nul, et baisse 
sinon, F regoit egalement sous cette meme forme les resultats d'autres 
operations (par exemple, les comparaisons entre A et un nombre ou un 
autre registre) meme si le contenu de A ne change pas a cette occasion. 



38 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 

On ne peut pas stocker de valeur particuliere dans F. Tout au plus peut- 
on lever ou baisser certains drapeaux, et sauver ou recuperer ce registre en 
meme temps que A. En revanche, A est extremement souple et la totalite 
des modes d'adressage peut faire appel a A, alors que certains ne sont pas 
disponibles sur les autres registres. 

Deux autres registres 8 bits sont tres utilises : H et L On les utilise 
d'ailleurs le plus souvent sous la forme 16 bits (registre HL), afin de stocker 
des adresses. En effet, HL accede & un grand nombre de modes d'adres- 
sage et est done ideal pour des travaux sur des tables de donnees, ou pour 
pointer sur des donnees. 

Les quatre autres registres 8 bits manipulates sont nommes B,C, D et E. 
lis sont moins souples que H et L : les registres BC et DE ne possedent pas 
tous les modes d'adressage de HL. En revanche, BC et B sont utilises 
comme compteur par toutes les instructions Z-80 travaillant a partir d'une 
boucle. DE possede egalement ses caracteristiques propres, tors des 
instructions de recherche ou transfert de chatnes (LDIR f CPIR et les 
instructions du meme style). 

II est a noter que deux registres 8 bits speciaux sont disponibles : il s'agit 
de I et de R. Leur utilisation est reservee au processeur. I est le registre 
d'interruptions, indiquant quel est le type de ('interruption. R servait dans le 
temps au rafraichissement de la memoire. II est utile pour gen6rer des 
nombres au hasard, car sa valeur est constamment modifiee et de fa?on 
relativement imprevisible. 



Les registres 16 bits 

Enfin, les registres IX et IY, de 16 bits exclusivement (il ne s'agit pas de 
registres Y et X regroupes avec le registre I) ont presque toutes les 
fonctionnalit^s de HL, plus une : ils permettent un mode d'adressage dit 
"indexe", que HL ne possede pas. Mais IX et IY sont "en plus" sur le Z-80, 
et il faut savoir que les instructions s'y rapportant sont beaucoup moins 
rapides que leurs equivalents travaillant avec HL. On les reservera 
I'utilisation de I'adressage indexe, ou bien pour pointer sur des tabl 
comme HL si Ton doit en traiter simultanement plus d'une. 



a 
es 



II existe deux autres registres 16 bits utilises tres peu parie programmeur 
et tres souvent par le processeur : PC et SP. PC est le pointeur de 
programme : e'est lui qui pointe I'instruction en cours d'execution. II y a 
quelques instructions permettant de modifier son contenu, et un grand 
nombre le faisant sans en avoir I'air. Entre autres, toutes les instructions JP 
et JR modifient PC (JP et JR sont exactement equivalentes a un GOTO 
Basic). Quant a SP, il pointe sur la pile du Z-80. 



UTILISATION LANGAGE MACHINE i 39 



La pile 



La pile est un endroit de longueur limitee mais indeterrninee (il faut 
s'arranger pour que la longueur qu'on lui octroie soit suffisante) ou sont 
rangees toutes les informations temporaires des programmes. Par exem- 
ple, lorsque le Z-80 rencontre une instruction CALL (equivalent en Basic : 
GOSUB), il range I'endroit de ['instruction en cours dans la pile, va executer 
le programme se situant a I'adresse demandee, et revient apres le CALL en 
recuperant I'adresse dans la pile (schema 2.2). 



© 

m 
m+3 



CALL n 



>■ SP remonte, la pile contient I'adresse (m+3) 



puis PC devient "n 



m+3 



SP 



PILE 



n + 



RET 



> PC devient (SP) soit m+3, SP redescend 



m + 3 ! •* 



SP 



PILE 



Schema 2.2 



La pile. 



40 i GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 

L'utilisateur a la possibility de travailler avec cette pile, et aussi avec 
d'autres piles, puisque des instructions permettent de sauver et de 
recuperer le contenu de SP. Toutefois, si l'utilisateur veut utiiiser deux 
piles, il devra gerer ses deux pointeurs (certains processeurs, comme ie 
6809, possedent deux pointeurs de piles, ce n'est helas pas le cas du Z-80). 

La pile est souvent utilisee dans les programmes pour sauver rapide- 
ment des registres avant un travail (ii serait plus simple de les sauver dans 
le second jeu de registres, mais nous avons vu plus haut que celui-ci est 
inutilisable sur I'Amstrad). Elle est tres pratique mais aussi tr§s dan- 
gereuse. En effet, si le nombre d'instructions rangeant quelque chose dans 
la pile n'est pas le meme que celui des instructions les recuperant, le risque 
de planter la machine est grand, et celui d'obtenir des erreurs de 
fonctionnement du programme est enorme. Imaginez une pile d'assiettes 
en porceiaine : si vous enlevez plus d'assiettes qu'il n'y en a dans la pile, il 
y a un imprevu. Inversement, si vous laissez une assiette avant de secouer 
la nappe, il va y avoir de la casse. En Z-80, si une routine appelee par CALL 
laisse une adresse de trop, le retour va se faire a I'endroit indique par celle- 
ci, qui n'aura rien a voir avec la bonne adresse se trouvant juste dessous. 
De meme, si la routine enleve une adresse de trop, le retour se fera aussi a 
un endroit n'ayant rien d'interessant. 

Les registres secondaires 

Les registres secondaires ne sont pas utilisables sur I'Amstrad. II est 
toutefois interessant de connaitre leur existence, lis sont au nombre de 
huit : A', F, B', C\ D\ E\ H' et L'. lis sont exactement equivalents, en temps 
normal, aux registres A a L Attention : il n'existe pas de IX', IV, PC ni SP'. 



INSTRUCTIONS DU Z-80 



Introduction 

Le Z-80 possede de nombreuses instructions. Elles peuvent toutes plus 
ou moins utiiiser les modes d'adressage disponibles. Rappelons qu'un 
mode d'adressage est une fa<?on d'acceder a une information. Le probleme 
du Z-80 est qu'il n'est pas orthogonal. Un processeur est dit orthogonal 
quand tous les modes d'adressage sont utilisables sur toutes les instruc- 
tions, ce qui est loin d'etre le cas en Z-80. 

Pour simplifier, nous n'allons pas passer en revue les differents modes 
d'adressage du Z-80. En effet, si ces modes sont facilement identifiables au 
niveau du code machine (les nombres correspondant aux instructions), il 
en est autrement au niveau des instructions proprement dites, sous leur 
forme assembleur comme JP ou ADD. A ce niveau, les modes d'adressage 
sont moins evidents. Par exemple, "JR adresse" est une instruction qui 



UTILISATION LANGAGE MACHINE I 41 

semble utiliser I'adressage absolu, puisqu'une adresse est precisee. En fait, 
il s'agit d'adressage relatif ! En effet, c'est le programme assembleur qui 
transforme I'adresse en un autre type de donnee. Ce genre de subtilite est 
un veritable piege pour le debutant qui aura bien du mal a faire la 
difference entre "JR adresse" et "JP adresse, qui font la meme chose et se 
presentent de la meme fagon. Le Z-80, par contre, fait la difference au 
niveau codage, encornbrement, rapidite et fonctionnement. 

Un debutant en Z-80 est vite mis en difficult^ par ia quantite d'instruc- 
tions disponibles. Mais au debut, seul un certain nombre d'entre elles sont 
veritablement utiles. C'est la liste de ces instructions vitales que nous 
allons etudier, ignorant volontairement un bon nombre destructions. 



Acces memoire, chargements des registres 



Tout d'abord, car il s'agit sans doute des instructions les plus utilisees, 
nous allons passer en revue les chargements de registres. Ces instructions 
LD permettent de stocker une valeur dans chacun des registres du Z-80. 
Mais il y a plusieurs fagons de preciser la donnee en question. 

On peut dans tous les cas preciser directement la valeur : il s'agit 
d'adressage immediat. Par exemple, "LD A,34" ou "LD BC,32767". Cette 
fagon de charger une valeur dans un registre est reservee aux initialisations 
(schema 2.3). 



LD BC, $ 7FFF 

I l 




Schema 2.3 



Adressage imrnediat. 



II est aussi possible, la plupart du temps, de charger un registre avec la 
valeur contenue dans un autre registre. Par exemple, "LD A,B" charge le 
contenu de B dans A (schema 2.4). 



A 
7E 



B 
7E 



t 



LD A,B 



Schema 2.4 



Adressage par registre. 



42 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 

Attention : ce type de chargement ne fonctionne que sur les registres 
8 bits. II n'existe pas de "LD BC,HL", par exemple. Pour obtenir la meme 
chose, il faut proceder en deux instructions, en I'occurrence "LD B,H" suivi 
de "LD C,L", Seul SP fait exception, puisqu'il est possible de charger 
directement dans ce registre les contenus de HL, IX ou IY. Cela permet de 
gerer assez facilement plusieurs piles. 

II est possible, pourtous les registres 16 bits (BC, DE et HL mais aussi IX, 
IY et SP) de charger tine donnee 16 bits en indiquant I'adresse ou elle se 
situe. On indique alors cette adresse entre deux parentheses. Ainsi, "LD 
BC, (4000)" permet de charger les deux octets situes en 4000 et 4001 dans 
les registres respectifs C et B (car le premier octet en memoire est celui de 
poids faible, c'est-a-dire situe a droite dans un nombre 16 bits). Cette 
possibility est aussi offerte au registre A, ainsi qu'd SP (schema 2.5). 



LD BC,($4000) 



MEMOIRE 



E 



c 










2 FF 


$3E 












$4E 


3FFE 






$7F 


3FFF 




-x-K^FFxS;: 


4000 
4001 












IW$$$W& 








$44 


4002 






i 

i 
i 

i 



Schema 2.5 



Adressage indirect 



IX et IY permettent un mode particulier de travail : on peut les associer a 
un deplacement afin de pointer dans une table. Exemple : "LD C,(IXh-4)" 
indique au Z-80 de charger, dans le registre C, le contenu de I'adresse 
IX+4, c'est-a-dire I'adresse contenue dans IX a laquelle on ajoute4. C'est 
ce qu'on appelle I'adressage indexe (schema 2.6 v. p. 43). 



UTILISATION LANGAGE MACHINE i 43 



LD C.OX+4) 



IX 
$4000 



+4 
index 



C 
$67 



MEMOIRE 




$05 



$76 



$3F 



$4E 



$67>x 



$88 



$01 



4000 
4001 
4002 
4003 



4004 



4005 
4006 



Schema 2.6 



Adressage indexe. 



Dans une moindre rnesure, ce type de travail peut egalement etre 
effectue par HL : "LD E, (HL)" permet ainsi de charger dans E le contenu de 
I'adresse indiquee dans HL On parle alors d'adressage indirect par 
registre. (HL), (IX+n) et (lY+n) peuvent ainsi etre utilises avec tous les 
registres 8 bits communs, et, en guise de bonus, A peut travailler 
egalement avec (DE), et avec (BC) (schema 2.7). 



LD C,(HL) 



H 
$40 


L 
00 










fe 














$06 


3FFD 






$FF 


3FFE 




$37 


3FFF 


C 
$85 


■y>-<<$85>>yy; 


4000 


^ 


w 


^ 


$97 


4001 




• 


$3D 


4002 




$3C 


4003 











Schema 2.7 



Adressage indirect par registre. 



44 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 

Les chargements en memoire, qui sont les instructions inverses des 
chargements de registres, travaillent obligatoirement (sauf trois excep- 
tions : "LD (HL),n", "LD (IX+n),m" et "LD (IY+n),m" qui autorisent le 
chargement direct d'une donnee d une adresse indiquee par les registres 
indiques) avec le contenu d'un registre. II est par exemple impossible 
d'effectuer un "LD (0),15" pour charger la vaieur 15 a I'adresse 0. Les 
chargements en memoire sont en nombre beaucoup plus reduits. D'une 
fagon generate, ils s'ecrivent "LD representation d'une adresse, registre" 
(schema 2.8), 



LD (IX + 3), $76 



$4000 



IX 



+3 
index 




$ww£® 



3FFC 
3FFD 
3FFE 
3FFF 
4000 
4001 
4002 
4003 



Schema 2.8 



Chargement indexe en memoire. 



On peut effectuer avec le registre A tout ce qui est imaginable a ce 
niveau ; chargement & une adresse indiquee par un registre 16 bits (par 
exemple "LD (BC), A"), chargement direct & une adresse ("LD (4000),A"), 
chargement indexe ("LD (IX+n),A">. Les operations a base du contenu des 
autres registres 16 bits sont par contre limitees a I'adressage indirect ou 
indexe. On ne peut charger un registre 8 bits autre que A qu'a une adresse 
indiquee sous la forme (HL), (IX+n) ou (lY+n). 

Enfin, il est possible de sauver a une adresse directement exprimee le 
contenu des registres 16 bits BC, DE, HL, IX, IY et SP (et, nous I'avons vu ci- 
dessus, on peut aussi utiliser A pour charger ainsi une vaieur 8 bits). 

Cela procure une liste non negligeable destructions. Dans la pratique, il 
suffit d'avoir une liste complete des instructions par ordre alphabetique a 
portee de main pour s'en sortir (voir annexe 1). 



UTILISATION LANGAGE MACHINE I 45 



La pile et sa gestion 



Autre categorie destructions : les instructions de gestion de la pile. 
Celles-ci sont regroupees sous les denominations PUSH et POP. PUSH 
perrnet de ranger dans la pile les registres 16 bits AF, BC, DE, HL, IX et IY. 
POP permet de recuperer dans la pile une valeur, en la chargeant dans un 
de ces registres. Ainsi, la sequence "PUSH BC" suivi de "POP HL" range le 
contenu de BC dans la pile et le retire immediatement pour le ranger dans 
HL Voila done le moyen d'effectuer un simili "LD HL,BC". Cela dit, cette 
manipulation est peu utilisee car elle est bien plus lente que la combinaison 
de "LD H,B" et "LD L,C". Par centre, il est possible d'utiliser la pile pour 
echanger des contenus de registres 16 bits facilement. 

Ainsi, on utilise ia sequence suivante pour inverser HL et BC {schema 
2.9) : 



© 



PUSH BC 



B 
7F 


C 
FF 


















H 
DE 


L 
3C 








► 



PILE 



: 



wmsm&m 



m$%mrm$& 



SP-3 
SP-2 *S 
SP-1 



SP+1 



SP — SP+2 



i 



avant aprcs 



PUSH HL 



BC 



7F 



FF 



HL 



DE 



3C 



C 



ffi 



;DB 



FF 



7F 




46 I GRAPHISMES FN ASSEMBLEUR SUR AMSTRAD 



3) POP BC 



B 

DE 


C 
3C 




H 
DE 


L 
3C 



:3C 



DE 



FF 



7F 



SP 



© 



POP HL 



B 
DE 



C 
3C 



H 
7F 


L 

FF 


4 




* 

















FF 



7F 



SP 



Schema 2.9 



Echange de registres par la pile. 



PUSH BC 
PUSH HL 
POP BC 
POP HL 

Enfin, on peut aussi resumer les instructions de gestion du registre SP, le 
pointeur de pile. Ce registre retient 1'emplacement de la pile, plus 
exactement ('emplacement du haut de la pile. Un PUSH diminue cette 
valeur de 2, et un POP I'augmente de 2. On peut charger SP avec les valeurs 



UTILISATION LANGAGE MACHINE I 47 

contenues dans un des registres HL, IX, IY, on peut aussi stocker 
directement une valeur ("LD SP,adresse") ou indirectement ("LD SP, 
(adresse)"). 

Dans le sens inverse, on peut sauver la valeur de SP a une adresse ("LD 
(adresse),SP"). II est egalement possible d'ajouter 1 a SP en utilisant « INC 
SP", ou d'enlever 1 avec "DEC SP". 

II existe d'autres instructions pouvant utiliser SP, mais elles relevent du 
haut professionnalisme ! 



Les drapeaux/flags 

Le Z-80 possede un registre F contenant les drapeaux, nous I'avons vu 
plus haut. Ces drapeaux sont au nombre de six, utilisant chacun un bit de F 
(il y a deux bits inutilises). Le drapeau C, appele "Carry", indique en general 
une retenue (lors d'additions), un changement de signe (soustraction) ou 
un des bits de A apres une rotation. On I'utilise, lors des debuts, 
principalement pour des tests de comparaison. 

Ainsi, apres une instruction "CP n" f le Carry vaut 1 si le contenu du 
registre A etait strictement inferieur a n, et sinon. 

Le drapeau N indique, lorsqu'il est mis a 1, que la derniere operation etait 
une soustraction (ce qui permet de savoir si le Carry provient ou non d'une 
telle operation). Peu de programmes en necessitent I'emploi, nous conseil- 
lons done vivement d'oublier pour I'instant son existence. 

Le drapeau P/V a un double sens. Lors des operations arithmetiques 
(addition, soustraction), il indique qu'un debordement a eu lieu. P/V est 
rarement utilise dans les programmes, sauf cas vraiment particuliers, 
comme des calculs en grande precision. 

Le drapeau H ne presente aucun interet non plus. Par contre, plus 
interessants sont les drapeaux Z et S. lis indiquent en effet respectivement 
la nullite et le signe de A. Si Z=1, le contenu de A est nul, ou bien (apres 
une comparaison) les nombres compares sont egaux. Si S=1, le nombre 
contenu dans 1 est negatif. 

Le debutant (ainsi que la plupart des programmeurs) n'utilisera utile- 
ment que C, Z et S. Ce sont en effet les drapeaux qui indiquent I'etat du 
contenu de A : on peut, en les consultant, savoir si A est coherent, nul, 
positif ou non. 

Les drapeaux ne sont jamais utilises en tant que tels : ils doivent etre 
consultes et associes a une instruction CALL, RET, JR ou JP. Selon 
I'association demandee, 1'instruction est executee si cette association est 
possible, et ignoree si ce n'est pas le cas. 



48 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 

Les associations sont les suivantes : 

- NZ pour savoir si Z=0 (A non nul, par exemple) ; 

- Z pour savoir si Z=1 ; 

- NC pour savoir si C=0; 

- C pour savoir si C=1 ; 

- PO pour savoir si P/V=1 ; 

- PE pour savoir si P/V=0 ; 

- P pour savoir si A est "P"lus grand que 0, soit positif (S=0) ; 

- M pour savoir si A est "M"oins grand que 0, soit negatif (S=1). 

Par exemple, ('instruction "JP P,4000" provoquera un saut en 4000 si le 
drapeau S est a 0. Elle sera ignoree si S est a 1. 



Sauts et branchements conditionnels 

Puisque nous en sommes a parler de CALL, JP et JR, autant les passer en 
revue, d'autant plus que cela terminera notre expose sur le Z-80. CALL est 
en LM I'equivalent de GOSUB en Basic : arrive a "CALL adresse", le 
programme saute a cette adresse, jusqu'a ce que RET soit rencontre. 
Ensuite, le programme revient a la suite du CALL. JP provoque la meme 
chose, mais sans retour possible (equivalent de GOTO). Enfin, JR est une 
version de JP destinee a de petits sauts (dans un endroit pas plus eloigne 
de I'instruction que par 128 octets). JR est un peu moins rapide que JP, 
c'est pourquoi nous ne I'utiliserons pas dans nos routines. JR a une seule 
utilite, qui n'est valable que pour des programmes d'un certain type. En 
gros, lorsqu'un programme utilise des JP, il ne peut fonctionner que s'il est 
charge a une certaine adresse bien precise, celle qui a ete choisie lors de 
I'assemblage. Par contre, si le programme utilise JR, il peut etre place a 
n'importe quelle adresse. Cette possibility ne nous interesse pas ici, car nos 
routines sont courtes, et nous les placerons toujours b un endroit bien 
connu. Les debutants n'ont aucun interet & utiliser JR. De plus, JR ne peut 
etre associe qu'aux conditions C, NC, Z et NZ. Et JP procure trois faciiites 
interessantes : il est possible d'utiliser "JP (HL)", "JP (IX)" et "JP (IY)" pour 
sauter a une adresse calculee. Cela permet de programmer ce que Ton 
appelle des "vecteurs", dont Amstrad fait un usage important a des fins de 
compatibilite entre ses differents modeles. 



Conclusion 

Nous laissons aux lecteurs le soin de consulter des livres specialises (par 
exemple ceux que nous vous recommandons plus haut) afin d'en connaitre 
plus sur les instructions arithmetiques et logiques du Z-80. II est egalement 
interessant de jeter un ceil sur les instructions SET, RES et BIT qui 
permettent de positionner, baisser ou tester n'importe quel bit de chacun 
des registres 8 bits, voire (HL) ou (IX+d) et (lY+d). 



UTILISATION LANGAGE MACHINE I 49 

Toutefois, lorsque nous utiliserons des instructions nouvelles non 
explorees dans ce chapitre, nous en expliquerons le fonctionnement et 
I'utilite. 



ASSEMBLEUR ET BASIC 



Stockage en memoire 

Maintenant que nous connaissons mieux le Z-80, revenons sur terre. 
Vous ne possedez pas forcement un assembleur, auquel cas les instruc- 
tions JP ou ADD ne signifient rien. Une seule chose est sure : votre 
Amstrad possede un Basic, et fort heureusement ce Basic permet tout de 
meme d'utiliser du langage machine. 

Comment se presente un programme en fangage machine lorsque nous 
sommes sous controle du Basic ? Rien de plus obscur : une belle suite de 
nombres apparemment incoherente. Comment le rentrer en memoire? 
Comment I'executer ? 

II faut avant tout savoir que POKE permet de modifier le contenu de 
n'importe quelle case memoire. Nous I'avons par exemple utilise lors du 
remplissage ecran. "POKE adresse, valeur 8 bits" est exactement equiva- 
lent, en LM, a "LD A,valeur" suivi de "LD (adresse), A". Vous pouvez, sous 
Basic, preciser I'adresse et la valeur soit en decimal, soit en hexadecimal 
(adresse ou valeur precedee de '&', par exemple &F23C), soit en binaire 
(prefixe '&X\ par exemple &X11010011). 

Cette instruction, associee a READ et DATA, permet de stocker un 
programme LM en memoire d'apres son listing. II suffit de taper les 
nombres correspondant aux instructions dans des lignes DATA, et de les 
lire I'un apres I'autre pour les stocker aux bonnes adresses grace a READ et 
POKE. 

Cette fagon de proceder est la plus simple pour des routines ne risquant 
pas de "manger" le Basic. Elle n'est pas optimale, on peut faire beaucoup 
mieux. On peut par exemple stocker directement des routines d I'interieur 
meme d'une ligne REM Basic. Mais cela necessite des precautions 
draconiennes. 

Lorsqu'une routine LM est placee en memoire, il faut en general lui 
reserver une p| ace pour eviter que le Basic ne vienne la detruire lors de ses 
travaux. L'instruction MEMORY a ce role. "MEMORY adresse-1" indique 
au Basic qu'il ne devra pas aller travailier au-dela de "adresse". Ainsi, apres 
"MEMORY &3FFF" le Basic ne travaillera jamais au-dela de $4000 (rappe- 
lons que le symbole '$' signifie hexadecimal, il est note '&' en Basic, et 
souvent '#' en assembleur). De cette fagon, I'espace libre est disponible 
pour le LM. 



50 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 

Execution et para metres 

Enfin, maintenant que nous pouvons stocker un programme LM en 
memoire et le proteger du Basic, il faut savoir I'executer. Pour cela, le Basic 
Amstrad possede CALL. "CALL adresse" execute !e programme LM situe a 
I'adresse indiquee, et revient au Basic lorsque RET est rencontre. 

Ces possibilites, tout ordinateur digne de ce nom les offre. Mais 
I' Amstrad va plus loin : CALL permet egalement le passage de parametres. 

Qu'entend-on par passage de parametres? Tout programme en LM 
fonctionne avec certaines valeurs. II y a les valeurs de depart, certes, celles 
qui doivent etre placees dans les registres au debut de la routine. Mais il se 
peut egalement que la routine puisse travailler a partir de valeurs 
inconnues. Par exemple, la routine SIN travaille a partir d'un nombre. Ce 
nombre est un parametre. CALL permet de passer ainsi des parametres a 
une routine, a charge pour celle-ci de les utiliser ou non. 

Ainsi, "CALL 8(4000,14,15" appellera la routine situee en $4000, en lui pas- 
sant les valeurs 14 et 15. Cela est extremement puissant, d'autant plus qu'il 
est possible d'envoyer une adresse de variable. "CALL &4000,A,B,@C" 
fournit a la routine le contenu des variables A et B, ainsi que I'adresse ou se 
trouve la variable C. Cela permet par exemple de ranger directement une 
valeur, par LM, dans une variable avant de revenir au Basic. 

Le Basic utilise, pour transmettre ces parametres, une table provisoire 
dont I'adresse sera contenue dans IX. Cette table est constitute de donnees 
16 bits exclusivement : on ne peut done passer que des parametres de type 
entier. 

Le d6but de la routine appelee par I'instruction CALL peut utiliser ces 
valeurs 16 bits, rangees dans I'ordre inverse de leur apparition. Ainsi, si 
nous avons "CALL &4000,Y,Z,@R", nous obtenons la table suivante : 

Adresse Contenu 

indiquee par 

IX+4 poids faible valeur de Y (8 bits de droite) 

IX+5 poids fort valeur de Y (8 bits de gauche) 

IX+2 poids faible valeur de Z 

IX+3 poids fort valeur de Z 

IX+0 poids faible adresse de localisation de R 

IX+1 poids fort adresse de localisation de R 



Cette table est utilisable, rappeions-le, des le debut de la routine, puisque 
le Basic s'occupe personnellement de transmettre IX. 

Nous savons done deja comment utiliser des valeurs transmises. Si nous 
voulons par exemple additionner Y et Z par langage machine, il suffit 
d'avoir la sequence LM suivante : 



UTILISATION LANGAGE MACHINE I 51 



LD 


L,(IX+4) 


LD 


H,(IX+5) 


LD 


E,(IX+2) 


LD 


D,(IX+3) 


ADD 


HL r DE 



L/addition aura bel et bien ete executee. Le probleme qui reste est le 
suivant : comment transmettre le resultat h R? 

Nous avons d6j& une partie de la solution, puisque nous avons vu que 
Ton pouvait passer a notre routine I'adresse de la variable R. Gr§ce a cette 
adresse, nous pouvons en effet modifier la valeur de la variable. Pour cela, 
il nous faut connaitre la structure des variables entieres, c'est-a-dire ce que 
nous allons trouver & I'adresse ainsi passee en parametre. 

La meilleure fagon de connaitre cette structure, c'est sans aucun doute 
d'utiliser le Basic pour afficher le contenu de la m6moire. Tapez le 
programme suivant : 

10 CLEAR :DEFI NT A-Z 
20 A=&1234 

30 FOR l= @A TO @A+1 
40 PRINT HEX$(PEEK(I),2); 
50 NEXT I 

A I'execution, vous obtenez le resultat 3412. Cela nous revele ce que 
nous voulions savoir : I'adresse @A indique I'adresse du contenu de A. 

Pour modifier la valeur de R dans la routine LM ci-dessus, il suffit de 
rajouter les instructions suivantes : 

EX DE,HL : pour passer le resultat dans DE et disposer de HL ; 

LD L,(IX+0) : pour stocker dans HL I'adresse de la variable ; 

LD H,(IX+1) : transmise comme dernier parametre; 

LD <HL),E : pour stocker le poids faible du r§sultat ; 

INC HL : dans la variable ; 

LD (HL),D : et son poids fort. 

Le travail de la routine est alors termine. Le programme 2.1 resume cette 
routine et montre son utilisation sous Basic, avec les passages de 
parametres. 



10; 

20 ;addition 16 bits avec retour du resultat 

30 ;dans une variable Basic (prog 2.1) 







40 ; 




4000 




50 [KB 
60 ; 


#4000 


4000 


DD6E04 


70 ADDITI: LD 


L,(IX+4) 


4083 


DD6605 


80 LD 


H,(IX+5) 



j premier noobre dans HL 



52 ! 


3RAPHISMES EN ASSEMBLEUR SUR AMSTRAD 


4006 


DD5E02 


90 


LD E,(IX+2) 


4009 


DD5tt33 


L00 
U0 ; 


LD D,(IX+3) ;deu>;ieaie noiabre dans DE 






L20 ;ici 


, 1 'addition proprement dite 






130 j 




400C 


19 


140 

150 ; 


ADD HL,DE 


- 




160 ;on 
170 j 


range le resultat dans la variable 


400D 


EB 


180 


EX DE,HL ;resultat passe dans DE 


400E 


DD6E80 


190 


LD L,(IX+0) 


4011 


DD6601 


200 


LD H, C1X+1) ;adresse du contenu dans HL 


4014 


73 


210 


LD (HU,E 


4015 


23 


220 


INC HL 


4016 


72 


230 


LD (HL),D ;le resultat deviant le con 


4017 


C9 


240 


RET 


Pass 


2 errors: 


00 





*********-**-*"*-**-*-*-*-** 



'addition 16 bits LM avec raodi-f de variable 



1 ' ******************** 

2 '** Programme 2.1 ** 
3 
4 
10 
20 
30 
40 
50 
60 
70 
B0 
90 



MEMORY &3FFF 

DEFINT a-z 

ad=&4000 

READ c:IF c=-l THEN 140 

POKE ad,c:ad=ad+l:GOTO 70 

DATA 221,110,4,221,102,5,221,94,2,221,86,3,25 
,235,221,110,0,221,102,1,115,35,114,201,-1 
140 INPUT "premier nambre ";A 
150 INPUT "second nombre " ;B 
160 C=0sCALI_ &4000,A,B,@C 
170 PRINT "resultat : " 
180 PRINT A;"+";B;"=";C 
190 END 



Organisation des routines 



Pour souple que soit cette possibility d'interfagage entre Basic et LM, elle 
n'est toutefois pas exempte de defauts. En effet, le temps perdu lors des 
passages de param&res est 6norme. Les operations de chargement d base 



UTILISATION LANGAGE MACHINE I 53 



de IX ou IY sont plus lentes que leurs equivalents avec HL, et le Basic a f de 
plus, un gros travail a faire lorsqu'il met en place les parametres dans la 
table point6e par IX. Vous pouvez constater le peu d'interet de notre 
routine d'addition en utilisant les programmes 2.2 et 2.3. 



1 ' **■*-***************** 

20 '** Programme 2.2 ** 

30 ' ******************** 

40 ' 

50 'addition chranometree 16 bits Lli 

60 ' 

70 MEMORY &3FFF 

80 DEFINT a-z 

90 ad=&4000 

100 READ c:IF c=-l THEN 130 

110 POKE ad,c:ad=ad+l:GOTO 100 

120 DATA 221,110,4,221,102,5,221,94,2,221,86,3,2 

5,235,221,110,0,221,102,1,115,35,114,201,-1 
130 A=300:B=312 
140 z!=TIME 
150 FOR 1=1 TO 100 
160 C=0:CALL &4000,A,B,@C 
170 PRINT "resultat : " 
180 PRINT A; "+";B; "= n ;C 
190 NEXT 

200 PRINT "Temps :"TIME-z! 
210 END 



10 ' ******************** 

20 '** Programme 2.3 ** 

30 * ******************** 

40 ' 

50 'addition chranometree 16 bits basic 

60 * 

70 DEFINT a-z 

80 a=300:b=312 

90 z !=TIME 

100 FOR 1=1 TO 100 

110 C=A+B 

120 PRINT "resultat : " 

130 PRINT A;"+";B;"=";C 

140 NEXT 

150 PRINT "Temps : "TIME-z ! 

160 END 



54 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 

Alors que dans un cas I'addition est effectu^e par LM et dans I'autre en 
Basic, le temps d'execution des deux programmes est quasiment le meme. 
Mais le passage de parametres par CALL a un interet : il n'oblige pas Sfaire 
de routine en fonction du nombre de parametres, ni a g6rer ceux-ci. De 
plus, les routines utilisant ce principe peuvent generalement etre rendues 
tres independantes du Basic en adoptant ['organisation suivante : 

D Appel Basic : 

- les parametres sont ranges a des adresses memoire bien precises ou 
dans des registres ; 

- CALL routine (voir "Appel LM" ci-dessous) ; 

- les resultats sont ranges des variables passees en parametres directe- 
ment a partir des registres ou des adresses memoire mis & jour par la 
routine ; 

- retour au Basic. 
D Appel LM : 

- la routine s'effectue et range les resultats eventuels dans des registres 
ou a des adresses precises. 

De cette fagon, la routine peut etre utilisee de fagon interne en LM et non 
pas uniquement a partir du Basic. II est & noter que cette organisation a ete 
retenue pour la quasi-totalite des routines du logiciel interne de I'Amstrad 
(d'ou la possibility de recuperer ces routines pour des logiciels d'applica- 
tion comme le Basic). 

Pour illustrer le passage de parametres, vous pouvez egalement utiliser 
le programme 2.4, qui effectue une soustraction 16 bits. 



4000 



10; 

20 ; soustraction 16 bits avec retour du resultat 

30 ;dans une variable Basic (prog 2.4) 

40 ; 

50 ORS #4800 



4000 


DD6E04 


70 SQU3TR: LD L,(IX+4) 


4003 


DD66B5 


30 LD H,(IX+5) premier nombre dans HL 


4006 


DD5E02 


90 LD E,(IX+2) 


4009 


DD5623 


100 LD D, (IX+3) ideuxiese nombre dans DE 

110 ; 

120 ;ici, la soustraction proprenient dite 

130 ; 


400C 


A7 


140 AND A ;carry-)-0 pour SBC 


400D 


ED52 


150 SBC HL,DE ;car il n'y a pas SUB HL,DE ! 

160 ; 



UTILISATION LANGAGE MACHINE I 55 



170 ;on range le resultat dans la variable 







180 ; 






400F 


EB 


190 


EX 


DE,HL 


4010 


DD6E00 


200 


LD 


L,(IX+0] 


4013 


DD6601 


210 


LD 


H,(IX+1) 


4016 


73 


220 


LD 


(HL),E 


4017 


23 


230 


INC 


HL 


4018 


72 


240 


LD 


(HJ,D 



4319 C9 



250 



RET 



;resultat passe dans DE 
;adresse du cmtenu dans HL 



;le resultat devient le 
contenu 



Pass 2 errors: 00 



1 ' ******************** 

2 '** Programme 2-4 ** 
3 
4 
10 



* ******************** 



16 bits LM avec modi-f de variab 



20 " soustracti on 

le 
30 ' 

40 MEMORY &3FFF 
50 DEFINT a-z 
60 ad=&4000 

70 READ c:IF c=-l THEN 140 
80 POKE ad,c:ad=ad+l:GOTO 70 
90 DATA 221,110,4,221,102,5,221,94,2, 

7,237,82,235,221,110,0,221,10: 

1,-1 
140 INPUT "premier nombre " ; A 

150 INPUT "second nombre " ; B 

160 C=0:CALL &4000 , A ,E ,@C 

170 PRINT "resultat : " 

180 PRINT A; "-" ; B; "= M ; C 

190 END 



1,86,3,16 

,1,115,35,114,20 



II existe egalement sur I'Amstrad une autre possibility d'interfagage des 
routines LM, il s'agit du RSX. Ce RSX (Resident System extension, soit 
Extension de systeme residente) permet de donner un nom aux routines et 
de les appeler par ce nom. II permet egalement de passer des parametres 
non entiers. Mais il a d'autres inconvenients. II rajoute une couche de plus a 
I'organisation que nous venons d'evoquer, et ralentit encore I'execution. 
Nous n'utiliserons done pas le RSX. 

Maintenant que nous savons comment utiliser des routines sous Basic, il 
nous reste un point important a eclaircir : ou allons-nous placer ces 
routines ? 



56 I GRAPHEMES EN ASSEMBLEUR SUR AMSTRAD 

De toute evidence, nos routines ne devront empieter ni sur le Basic 
(encore que ce soit acceptable si celui-ci n'est pas utilise), ni surtout sur le 
systeme d'exploitation. En effet, la machine proprement dite utilise 
grandement le systeme d'exploitation et sa zone de memoire vive. 

II est possible de grignoter une partie de cette memoire vive, notamment 
celle qui contient des vecteurs destines a I'appel des routines de gra- 
phisme, de la gestion cassette, etc. Mais dans ce cas, on perd I'acces facile 
a ces routines (situees en ROM "sous" la RAM, il faut pour les appeler se 
livrer a une manceuvre des plus deiicates). De plus, la place ainsi recuperee 
n'est pas reellement importante. 

Pour faire le point, eteignez votre ordinateur et rallumez-le. Juste apres la 
mise sous tension, tapez PRINT HEXS(HIMEM). Ce!a vous donnera la plus 
haute adresse disponible pour le Basic, c'est-a-dire en pratique la plus 
haute adresse memoire utilisable sans probleme. Au-dela, il y a de grandes 
chances d'ecraser des tables systeme, une pile ou pire encore. 

Sur un Amstrad CPC 464 equipe d'un lecteur de disquettes, la plus haute 
adresse ainsi accessible est $A67B. Nous pouvons consid§rer, la pratique 
aidant, que la premiere adresse rode aux alentours de $200. On peut 
descendre plus, mais il devient alors difficile de gerer quoi que ce soit sous 
Basic. Un rapide calcul vous informe du nombre d'octets utilisables : 

PRINT &A67B-&200+6536 

Nous devons ajouter 65536 ici pour obtenir un nombre positif : au-deia 
de $7FFF, les nombres hexadecimaux deviennent negatifs, et il faut ajouter 
65536 pour obtenir la valeur decimale positive qu'ils represented reelle- 
ment. Nous obtenons ainsi 42107, ce qui donne presque 42 Ko disponibles 
pour les programmes en langage machine. 

Pratiquement, dans cet ouvrage, nous ne placerons aucune routine en 
dessous de $3000. En effet, il faut laisser suffisamment de place pour un 
petit programme Basic (en I'occurrence, cela laisse environ 1 2 Ko), faute de 
quoi ('utilisation des routines devient impossible ! 

Pour eclaircir les choses, vous trouverez en annexe 4 une carte de la 
memoire de I'Amstrad. 



ROUTINES GRAPHIQUES Q 

DU SYSTEME O 



58 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 

SYSTEME D'EXPLOITATION 



Organisation 

Comme nous I'avons laisse entendre plusieurs fois, I'Amstrad se distin- 
gue des autres micro-ordinateurs par la conception de son logiciel interne, 
beaucoup plus evoluee et proche des systemes d'exploitation d'ordina- 
teurs professionnels comme I' IBM-PC. 

Le principe de base de ce logiciel interne est en effet la programmation 
dans le systeme d'exploitation de tout ce qui permet de gerer les 
ressources de I'ordinateur, et non pas seulement de quelques routines. 
C'est ainsi que les 16 Ko de memoire morte contenant le systeme 
d'exploitation (les autres 16 Ko constituent I'interpreteur Basic) regroupent 
toutes les routines de gestion des interruptions, des graphismes ou des 
memoires de masse (cassette, disquette...). 

Ces routines sont situees en memoire morte : leur fonctionnement ne 
peut done etre modifi6 simplement, et par consequent le Basic serait fige 
s'il les appelait par leur adresse precise. De plus, a la moindre amelioration 
materielle, la compatibilite avec les programmes existants serait perdue. 
La plupart des constructeurs font leur lot de ce probleme, ce qui explique 
pourquoi des appareils comme r Apple II ou le T07, coinces par la necessite 
de la compatibilite, n'ont guere evolue depuis leur creation. 

Le logiciel interne de I'Amstrad, en revanche, est congu pour evoluer. En 
effet, il utilise un vecteur pour chaque routine, afin de preserver la 
compatibilite sans bloquer I'evolutivite du systeme. Pour mettre en 
evidence I'avantage de ce principe, il suffit de savoir qu'il est parfaitement 
possible d'installer sur un Amstrad une extension dotee de memoire morte 
qui mettrait en place des graphismes du type 512X256 en 256couleurs, 
tout en gardant la compatibilite avec les logiciels existants ! 



Vecteurs 



Qu'est-ce qu'un vecteur, et quel est done son principe de fonctionne- 
ment ? Un vecteur est soit une adresse, soit une instruction de saut & une 
adresse. IE s'agit d'une information en memoire qui indique, lorsqu'on la 
consulte, ou trouver I'information que Ton cherche. Ces vecteurs sont 
situes en memoire vive. Lors de la mise en route de I'ordinateur, ils sont 
installes, d'apres les indications en ROM, a leur adresse et pointent sur le 
bon emplacement, celui de I'Amstrad standard. Or, rien n'interdit de 
modifier ces vecteurs (puisqu'ils sont en memoire vive) afin de substituer 
une routine a celle visee par le vecteur. De cette fagon, on peut par exemple 
modifier radicalement le fonctionnement de la routine tracjant une ligne 
entre deux points. II suffit de reprogrammer la routine, et de modifier le 
vecteur de DRAW pour qu'il pointe sur la nouvelle (schema 3.1 v. p. 59). 



ROUTINES GRAPHiQUES DU SYSTEME I 59 



RAM 
programme 



RAM 
vecteurs 



ROM 



CALL X 















b X 


JP DRAW 


b DF 


AW-* 


Routine 
DRAW 


W ^ 


~ L^l 




















RET 































Schema 3.1 



Un vecteur. 



Les avantages des vecteurs sont multiples : tout d'abord, ils garantissent 
la compatibilite d'un materiel a ('autre pour les programmes qui les ont 
utilises. Meme si le contenu de la ROM change (et done le contenu des 
vecteurs), les vecteurs ne changeront pas de place. Un appel a un de ces 
vecteurs aura le meme effet quel que soit le modele d'Amstrad utilise. 
Meme si, demain, Amstrad sort un nouvel ordinateur dote de 256 Ko et 
d'un processeur graphique different du 6845, rien n'interdit la compatibilite 
si Amstrad respecte les vecteurs pour adresser les nouvelles routines 
graphiques. Aucun autre micro-ordinateur ne peut pretendre a la meme 
performance. 

Ensuite, il est facile de changer les routines soi-meme, en detournant ces 
vecteurs. On peut par exemple ainsi modifier totalernent les routines de 
chargement et de sauvegarde cassette, sans affecter le moins du monde le 
fonctionnement du Basic ou des programmes utilisant ces routines par 
appel de vecteurs. 

Enfin, ultime avantage, ils forment un bloc compact regroupant la totalite 
des fonctionalites de I'ordinateur. Le programmeur LM se retrouve avec 
une sorte de langage machine evolue, lui permettant de programmer une 
grande partie des taches aussi simplement qu'en Basic. 

Le seui defaut des vecteurs est le ralentissement qu'ils provoquent lors 
de I'execution des routines systeme et la place qu'ils occupent en memoire 
vive. Mais les avantages procures en valent largement la peine. 

Par contre, mais cela ne vient pas de I'utilisation des vecteurs, on peut 
reprocher a I'Amstrad une programmation quelque peu fantaisiste de 
certaines routines systeme. Ainsi, la quasi-totalite des routines graphiques 
est d'une lenteur exasperante (toutes proportions gardees) et modifie le 



60 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 

contenu des registres. II appartient a I'utilisateur de sauver les registres 
voulus avant de les utiliser, ce qui est souvent penible et ralentit encore 
I'execution. 

Toutefois, I'utilisation du Graphic Manager (terme regroupant les rou- 
tines graphiques du systeme accessibles par un vecteur) n'est pas denuee 
d'int6r§t, nous allons done nous y pencher. 

Outre les routines systeme, Amstrad a eu I'excellente idee de reserver un 
bon nombre de vecteurs pour les routines de calcul du Basic. En effet, le 
systeme d'exploitation proprement dit ne contient aucune routine de calcul 
en virgule flottante (nombre dits "reels"), et si Ton ne tient pas compte du 
Basic, les programmes d'application doivent done fournir les leurs si 
besoin est. Sur I'Amstrad, toutes les routines utiles (fonctions logarithmes, 
tangentes, y compris les routines de conversion "format binaire <-> 
format reel") possedent un vecteur qui permet de les utiliser comme des 
instructions du processeur. II y a certaines restrictions, et surtout beaucoup 
de regies strictes a respecter lors de I'utilisation de ces routines. 

Les vecteurs de I'Amstrad sont situes en memoire vive, de $BB0O a 
$BE00. Ceux qui nous interessent ici sont les vecteurs des routines 
graphiques qui sont regroupes de $BBBA a $BBFC (voir annexe 2). 



TRACE DE CERCLES 



Methode de trace 

Pour mettre en application les appels systeme, nous allons realiser une 
routine de trace de cercles. Cette instruction manque au Basic Amstrad, il 
faut done I'implementer. 

Le trac6 de cercle peut etre extremement simple. La preuve la plus 
evidente est le programme Basic suivant : 

10 MODE 2 

20 DEG 

30 FOR angle=0 TO 360 

40 PLOT COS(angle)*100+319,SiN(angle)*100+199,1 

50 NEXT angle 

L'execution de ce programme permet d'obtenir un cercle de 100 points 
de large centre au milieu de I'ecran. Le probleme de ce programme est sa 
lenteur exasperante. II est cependant facile de I'ameliorer, meme en Basic. 

En effet, bien qu'un cercle soit defini par I'ensemble de ses points sur 
360degres, il est tout S fait possible de n'effectuer les calculs de sinus et 
cosinus que sur 45 degres, et de tracer tous les points associes par 



ROUTINES GRAPHIOUES DU SYSTEME I 61 

symetrie. En i'occurrence, si X et Y sont les coordonnees correspondant k 
un angle donne, compris entre et 45, les points traces seront les 
suivants : 

(X,Y) <X,-Y) <-X,Y) <-X,-Y) 
(Y,X) (Y,-X) (-Y,X) (-Y,-X) 

Cela suppose que le centre du cercle est place en (0,0) (schema 3.2). 




(-x,-y) 



(Rcosx, Rsinx] 



► 

R x 



(x-y) 



Schema 3.2 



Les points d'un cercle. 



Grace a cette astuce, nous pouvons done diviser le nombre de calculs par 
un facteur de 8. De plus, si nous stockons les valeurs des sinus et cosinus 
dans un tableau, il nous suffira de rappeler ces valeurs pour tracer tous les 
cercles voulus, sans aucun calcul de sinus ou de cosinus. 

Pourquoi se compliquer ainsi la vie ? La raison en est simple : que ce soit 
en LM ou non, le calcul d'un sinus necessite une arithmetique en virgule 
flottante (des nombres reels), done complexe, et surtout lente. 



62 I GRAPHEMES EN ASSEMBLEUR SUR AMSTRAD 

Parlors encore de I'arithmetique flottante, justement. Qu'il s'agisse d'un 
jeu d'aventure ou d'action, ce type de calculs en LM doit gen§ralement etre 
evite, ne serait-ce qu'£ cause de leur lenteur. II resulte aussi generalement 
de ce type d'arithmetique un codage encombrant des nombres (5 octets 
sur I'Amstrad), et un manque de souplesse pesant (impossible de tes g6rer 
par des operations sur les registres). 

Mais ce n'est pas toujours simple. Notamment, comment transformer les 
valeurs des sinus et des cosinus, qui sont comprises entre -1 et 1 ettoutes 
a virgule, en nombres compris entre et 255 et entiers ? 

[.'operation est en fait bien plus simple qu'il n'y parait. En effet, puisque 
le sinus est compris entre —1 et 1, il suffit de le multiplier par 256 pour 
obtenir une valeur comprise entre -256 et 256 ! Ce n'est pas tout, bien sur. 
Si nous voulons pouvoir utiliser le sinus sous cette forme, il faudra, au 
moment des calculs, se souvenir qu'il doit etre divise par 256. En 
['occurrence, la division par 256 est aisee en langage machine. 

Resumons-nous. Nous avons trouv6 le moyen de tracer huit points d'un 
coup, et de memoriser les sinus et cosinus sous la forme de nombres 
entiers. Nous voici d6jci beaucoup plus proches du LM. Le programme 3.1 
en Basic le prouve. Le trace des cercles y est tr£s rapide pour du Basic. II est 
en tout cas plus satisfaisant que le programme a base de nombres reels vu 
plus haut. 



1 ' ******************** 
20 '** Programme 3-1 ** 

30 ' ******************** 

40 ' 

50 DEFINT a-z 

60 DIM si (45) ,co(45) 

70 DEB: FOR i=0 TO 45: co (i ) =COS (i ) *256: si Ci ) =SIN ( 

i ) *256 
S0 si (i)=si (i)-Msi (i )=256> :co(i)=co(i) + (co(i )=25 

6) 
90 NEXT i 

100 INPUT "Rayon " ; s 
110 MODE 2 
120 ORIGIN 319,179 
130 FOR r=10 TO 200 STEP s 
140 FOR i=0 TO 45 

150 ;<=co(i >*r/256:y=si (i )*r/256 
160 PLOT x ,y,l 
170 PLOT -x,-y,l 
180 PLOT x,-y,l 
190 PLOT -x,y,l 
200 PLOT y,x 
210 plot -y,-x 



ROUTINES GRAPHIQUES DU SYSTEME I 63 



220 


PLOT 


-y,x 


230 


PLOT 


y,-x 


240 


NEXT 




250 


NEXT 




260 


GOTO 


100 



La boucle des lignes 130 et 250 trace plusieurs cercles concentriques. 
Vous pouvez a cette occasion constater I'avantage de vitesse procure par la 
disparition des calculs de sinus et cosinus. En effet, le trace de cercle y est 
effectue gr§ce aux nombres entiers stockes dans ies tableaux SI et CO. 
Vous remarquerez Ies calculs de la ligne 150, qui permettent d'obtenir Ies 
coordonnees du point de base assocte a un angle, en fonction du rayon R. 
Ce calcul utilise Ies valeurs de SI et CO, en Ies divisant par 256. Mais X et Y 
sont bel et bien des valeurs entieres, comme en temoigne la ligne 50 (elle 
indique que toutes Ies variables, sauf sur demande, seront entieres). 
L'int6ret de la methode, outre le gain appreciable de vitesse apporte, reside 
dans la precision du trace, tout aussi belle que si des nombres reels avaient 
ete utilises. 



Transposition en assembleur 

II ne reste plus qu'a transposer la methode en LM. Pour ce faire, il nous 
faut considerer deux possibilites. Si vous tracez un cercle de rayon 200, 
vous constatez que Ies points, tres proches, ne le sont toutefois pas assez 
pour donner un cercle propre. L'id6al serait de relier ces points par des 
droites. C'6tait simple avec notre petit programme exemple, ou tous Ies 
points 6taient dessines Tun apres I'autre dans I'ordre. Mais avec notre 
methode des symetries, deux points contigus du cercle sont s6pares par 
sept traces de points I 

II nous faudra done revoir quelque peu la m6thode de trace pour avoir 
des cercles propres. La methode de calcul reste toutefois valable. Nous 
allons avant tout realiser la premiere methode de trace (par points), car elle 
est plus simple et tres rapide. 



Multiplication en assembleur 



Si vous avez un peu I'habitude du langage machine, la ligne 150 du 
programme vous a immediatement saute aux yeux a cause du signe "*" 
qu'elle contient. La multiplication est la bete noire de ceux qui cherchent a 
optimiser la vitesse d'execution des programmes. Supposons que nous 
voulions multiplier le registre DE par A, et obtenir le resultat dans HL. Cela 
a d6ja une signification : HL se singularise par ses instructions etendues, 



64 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 



c'est pour cela que nous y placerons le resultat. La premiere idee, puisque 
I'on multiplie un entier par un entier, est d'additionner A fois le nombre DE 
dans HL 

Nous obtenons tres facilement la routine suivante : 



MULT: LD B,A 
LD HLO 



: stocke compteur dans B pour DJNZ ; 
: mise a zero du resultat ; 



ADDI: ADD HL,DE : additionne DE au resultat; 
DJNZ ADDI : B fois ; 

Malheureusement, elle a un enorme defaut. Si le multiplicateur A vaut 3 
ou 6, tout va bien. Mais si c'est 200, nous allons effectuer 200 additions 
pour une simple multiplication ! Pour aller plus loin, il faut se pencher sur 
le fonctionnement d'une multiplication. 

Tout serait simple si nous etions en base dix : nous savons faire une 
multiplication chiffre par chiffre, en multipliant implicitement le resultat par 
1 pour le chiffre des unites, par 10 pour celui des dizaines, et ainsi de suite. 

Le fait de savoir cela nous fait dej£ progresser d'un grand pas. En effet, la 
multiplication travaille exactement de la meme fagon (heureusement) en 
base 2. On multiplie chiffre par chiffre, en multipliant le resultat de .'unite 
par 1, puis celui de second chiffre par 2, puis par 4, 8 et ainsi de suite. 

C'est meme plus simple qu'il n'y parait : la mutiplication d'un nombre 
par un chiffre, en base deux, n'a que deux resultats : si le chiffre est 0, le 
nombre lui-meme si le chiffre est 1 (schema 3.3). 







a 


b 


c 


c! 


e 






X 


1 


1 





1 




a 


b 


c 


d 


e " 



















a 




a b 


C 


d 


e 


, 






a b c 


d 


e 


■ 


• 


■ 




Addition 


3'inaire 








1 


1 





1 








X 


1 


1 


o] 













0« 


> 






1 


1 





1 




1 


1 





1 


• 


• 




1 





1 


1 


1 





Sch 


ema 3.3 
















chiffre : le resultat est "0000" 
chiffre 1 : le resultat est "1101" 



Multiplication binaire. 



ROUTINES GRAPHIQUES DU SYST^ME I 65 

Voyons comment multiplier le nombre "abcde" par "xyz", en supposant 
que "abcde" et "xyz" sont binaires (exprimes en base 2, done avec des 1 et 
des 0). Tout d'abord, nous devons regarder si z vaut 1. Si oui, nous 
retenons le resultat "abcde", sinon 0. De la memefagon pour Y : si y vaut 1, 
e'est "abcdeO" que nous ajouterons au resultat precedent. Et enfin, pour le 
cas ou x vaut 1, nous ajouterons "abcdeOO". La somme doit nous donner le 
bon resultat. 

Maintenant, regardons de nouveau nos registres. DE contient ('equiva- 
lent de "abcde", mais avec 16 chiffres, et A celui de "xyz" sur 8 chiffres. 
Nous pouvons utiliser HL pour stocker au fur et a mesure les resultats 
intermediates. 

Le reste est simple. En effet, le Z-80 dispose de nombreuses fonctions de 
rotation et decalage permettant de modifier les contenus des registres. En 
l'occurrence, il est possible de decaler DE vers la gauche par la suite 
destructions suivantes ; 

SLA E 
RL D 

La premiere instruction prend le premier bit de E (le bit 7) et le range dans 
le Carry (e'est le drapeau C du registre F), puis decale les sept autres bits 
vers la gauche (te bit 6 vient en 7, le bit 5 en 6, etc.) et met un au bit 0. RL 
D, pour sa part, effectue presque ia meme chose (decalage a gauche du 
registre D) mais, au lieu de mettre un zero au bit 0, il y place le contenu du 
Carry. Nous avons done ainsi decale tout DE vers la gauche (schema 3.4). 



® 



SLA E 









D 


















E 









a' 


b' 


c' 


d' 


e' 


r 


g' 


h' 




a 


b 


c 


d 


e 


f 


g 


h 


«- 






















i 




















i 













H 



PV 



N 



"Carry" 



66 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 



2) RL D 



D 



a' 


b' 


c' 


d' 


e' 


f 


g' 


h' 


«-, 




b 


c 


d 


e 


f 


g 


h 







































* 


F : 


















































a 


















S 


z 


H PV 


N 


C 

—A 







3) RESULT AT 



D 



b' 


c' 


d' 


e' 


f 


g' 


w 


a 




b 


c 


d 


e 


f 


9 


h 


ft 



F: 



a' 



Schema 3.4 



Decalage de registre 16 bits. 



Nous avons huit chiffres dans A. RRA permet de decaler ces bits vers la 
droite, et de recuperer le chiffre ainsi ejecte hors de A dans le Carry, par 
exemple pour le tester et savoir si Ton doit additionner un resultat dans HL 
ou non. 



© 



A; 



a 


b 


c 


d 


e 


f 


9 


h 



F : 



x 



ROUTINES GRAPHIOUES DU SYSTEME I 67 



© 



RRA 





b 


c 


d 


e 


f 


g 


h 


X 






^ 






^ 


F : 
















a 




C 

t 



Schema 3.5 



Decalage a droite. 



Voici finalement notre routine : 



MULT: LD 

LD 
RRA 
POIDS: JP 

ADD 



SUIV: 



SLA 
RL 



RRA 



DJNZ 



B,8 



HL,0 



NCSUIV 



HL,DE 



E 
D 



POIDS 



il y a huit chiffres a examiner dans 
A, nous allons done faire huit 
boucies ; 

nous mettons le stockage du resul- 
tat a zero. 

premier decalage : le bit de A 
dans le Carry. 

si le Carry est a zero, le chiffre 6tait 
zero, il n'y a done aucune addition 
a faire, simplement passer au chif- 
fre suivant. 

le chiffre etait 1, nous additionnons 
done le resultat intermediaire dans 
HL 

nous decalons DE vers la gauche 
en ajoutant un a sa droite. De 
cette fagon, DE represente le resul- 
tat intermediaire pour le prochain 
chiffre. 

nous envoyons par rotation a 
droite le prochain chiffre dans le 
Carry. 

suite... jusqu'd ce que les huits 
chiffres aient ete examines. Remar- 
que : DJNZ ne modifie pas F, et ne 
touche pas le contenu du Carry. 



68 I GRAPHEMES EN ASSEMBLEUR SUR AMSTRAO 

Si nous nous sommes 6tendus sur cette routine, c'est qu'elle represente 
I'esprit meme du langage machine. Dans le pire des cas, cette routine 
procede a 8 additions, au lieu de 255 pour la premiere version. Bien sur, 
son fonctionnement est plus complexe. Mais I'utilisation des decalages et 
rotations montre jusqu'a quel point on peut optimiser une routine LM. De 
plus, cette routine pourra toujours servir plus tard. 



Le trace en assembleur 



Maintenant que nous avons notre routine de multiplication, le reste est 
simple. Tout au plus y a-t-il quelques subtilites dues £ la m6thode de trace. 
Notamment, il nous faut disposer de X et Y, mais aussi de -X et -Y pour 
tracer nos huit points. Or, notre routine est incapable de multiplier par un 
nombre negatif. De plus, il serait stupide de proceder a une seconde 
multiplication simplement pour inverser un signe. La solution, HL conte- 
nant notre X ou notre Y, est la suivante : 

LD A,L 
CPL 
LD L,A 
LD H,255 

Mais attention : ceci convient car nous savons, par definition, que X et Y 
ne depassent pas 256 (puisqu'ils sont divises par 256, apres la multiplica- 
tion par le sinus ou le cosinus, eux-memes implicitement multiplies par 
256). Ensuite, HL contient effectivement -X ou — Y. 

Enfin, nous arrivons au trace des points proprement dit. Nous I'avons 
laisse entendre plus haut, I'Amstrad nous facilite grandement la tache a ce 
niveau. En effet, un vecteur situe en $BBEA pointe la routine PLOT. II suffit 
d'effectuer CALL $BBEA pour allumer le point situ6 en (DE,HL). Seul d6faut 
de la routine : elle modifie HL et DE (entre autres) et nous oblige done a 
recuperer avant chaque trace de point les valeurs de X, —X, Y ou — Y dans 
HL et DE. 

C'est une des particularity g§nantes des routines systeme : une grande 
partie d'entre elles "mange" ainsi des registres que Ton aimerait conser- 
ver. Les solutions : ou bien Ton stocke les valeurs dans la pile et on les 
recupere par des POP (suivis de PUSH pour les reinstalled entre chaque 
appel de routine, ou bien on les place a des adresses bien determinees. 
Cette derniere solution est de tres loin la plus satisfaisante quant a la 
rapidite, bien qu'elle nous oblige a grignoter un certain nombre d'octets en 
plus. 

Vous pouvez constater, dans le listing assembleur du programme 3.2 
(v. p. 69) qu'd part les points evoques en detail ci-dessus, la routine est 
assez simple. Elle travaille exactement comme le programme 3.1 Basic vu 
plus haut. 



ROUTINES GRAPHIQUES DU SYSTEME I 69 







10; 










20 ;trace de cercles et d'ell 


ipses par LH 






30 ;utilise une table des cosinus et sinus 






40 ; (prog 


3.2) 








50 ;«thode paint par point 








60; 






BBC9 




70 ORIGIN 


EQU SBBC9 




BBEA 




80 PLOT: 


EOJ #BBEA 








90; 










100 ;suppose que la couieur d'ecriture graphique 






110 ;est deja selectionnee 








120 ; 






wn 




130 
140 ; 


ORG 14003 




4000 


DD7E00 


150 BASIC: 


U) A,<IX+0) 


irayor deaande 


4005 


32B740 


160 


LD (RAYON] ,A 




4006 


DD6E02 


170 


LB L,(1K+2J 




4009 


DD66B3 


180 


LD H,(IX+3) 


;Y centre 


400C 


DD5E04 


190 


LD E,UX+4) 




400F 


DD5685 


200 


LD D,(IX+5) 


jX centre 


4012 


CDC9EB 


210 
220 ; 


CALL ORIGIN 




4015 


062E 


230 Ufa 


LD B,46 


jnoinbre de baucles 


4017 


11C14B 


240 


LD DE,TABLE 


; table des sinus et cosinus 


401A 


C5 


250 POINT: 


PUSH BC 


jsauve coapteur de boucles 


401B 


1A 


260 


LD A,(DE) 


j sinus 


401C 


D5 


270 


PUSH DE 




401D 


ED5BB74B 


280 


LD DE, (RAYON) 


; rayon du cercle 


4021 


CDA340 


290 


CALL MULT 


joultiplie sinus(A) par rayon (DE) 


4024 


6C 


300 


LD L,H 


; division par 256 


4025 


2600 


310 
320 ; 


LD H,0 




4027 


22BB40 


330 
340 ; 


LD <Y),HL 


;stocke y 


402A 


7D 


350 


LD A,L 




402B 


2F 


360 


CPL 




402C 


6F 


370 


LD L,A 




4020 


26FF 


380 


LD H,255 




402F 


22BF40 


390 
400 ; 


LD (VN) t HL 


;stocke -y 


4032 


01 


410 


POP DE 




4033 


13 


420 


INC DE 


; passe au cosinus dans table 


4034 


1A 


430 


LD A,(DE) 


; cosinus 


4035 


13 


440 


INC DE 


ipour la suite de la table 


4036 


D5 


450 


PUSHDE 




4037 


ED5BB74B 


460 


LD DE, (RAYON) 




403B 


CDA340 


470 


CALL MULT 


;nultiplie cosinus(A) par rayon (DE) 


403E 


6C 


430 


LD L,H 


jdivisian par 256 


403F 


26190 


490 
500 ; 


LD H,0 




4041 


22B940 


510 

520 ; 


LD (X),HL 


jstocke x 



70 I GRAPHEMES EN ASSEMBLEUR SUR AMSTRAD 



4044 7D 


530 


LD A,L 




4045 2F 


540 


CFL 




4046 6F 


550 


LD L,A 




4047 26FF 


560 


LD H,255 ■ 


i 


404? 228D40 


570 
580 ; 


LD (XN),IL 


jstocke -x 




598 ;trace effect if d'apres X, 


Y ,XN et YN 




600 ; 






404C ED5BB940 


610 


LD DE,U) 




4050 2ABB40 


620 


LD HL,(Y) 




4053 CDEABB 


630 


COIPLQT 


;(x,y) 


4056 ED5BB940 


640 


LD DE, (X) 




405A 2ABF40 


650 


LD HL,(YN) 




405D CDEABB 


660 


CALL PLOT 


;(x,-y> 


4060 ED5BBD40 


670 


LD DE,(XN) 




4064 2ABB40 


680 


LD HL,(Y) 




4067 CDEABB 


690 


CALL PLOT 


;H,y> 


406A ED5BBD40 


700 


LD DE, (XNJ 




406E 2ABF40 


710 


U HL,(YN) 




4071 CDEABB 


720 


CALL PLOT 


;(-x,-y> 


4074 ED5BBB40 


730 


LD DE,(Y) 




4078 2AB940 


740 


LI HL,(X) 




407B CDEABB 


750 


CALL PLOT 


;(y,x) 


407E ED5BBB40 


760 


LD DE,W 




4082 2ABD40 


770 


LD HL,(XN> 




4085 CDEABB 


780 


CALL PLOT 


i<y,-x) 


4088 ED5BBF40 


790 


LD DE,(YN) 




408C 2A8940 


800 


LD HL,(X) 




408F CDEABB 


810 


CALL PLOT 


;(-y,x) 


4092 ED5BBF40 


820 


LD DE, (YN) 




4096 2ABD40 


830 


LD HL,(XN) 




4099 CDEABB 


840 


CALL PLOT 


;(-y,-x) 


409C Dl 


850 


POP DE 


jrecupere table sinus et cosinus 


409D CI 


860 


POP BC 


jrecupere ccwpteur 


409E 05 


870 


DEC B 




409F C21A40 


880 


JP NZ,PQINT 


; suite du trace 


40A2 C9 


890 


RET 


;et fin ! 




900 ; 








910 ;routi 


ne ffiultipliant DE par A dans HL 




920 ; 






40A3 0608 


930 HULT: 


LD B,8 


;il y a huit bits 


40A5 210000 


940 


LD HL,0 




40A8 CB2F 


950 
960 ; 


SRA A 


;bit dans carry 


40AA D2AE40 


970 POIDS: 


JP NC,SUIV 


;pas d 'addition 


40AD .19 


930 


ADD HL,DE 


jaddition de la puissance 


40AE CB23 


990 SUIV: 


SLA E 


;iBultiple DE par deux 


40B0 CB12 


1000 


RL D 


;iden, recupere carry de SLA E 


48B2 CB2F 


1010 


SKA A 


jdecale A, copier bit dans Carry 


40B4 10F4 


1020 


DJNZ POIDS 


;suite oulti plication 


40B6 C9 


1030 
1040 ; 


RET 





ROUTINES GRAPHIQUES DU SYST&ME I 71 



40B7 


mm 


1050 RAYON 


40B9 


?m 


1060 X: 


4BBB 


0080 


1070 Y: 


40BD 


0000 


1080 XN: 


48BF 


0000 


1090 YN: 


net 


00FF04FF 


1100 TABLE 


4i3C9 


12FF16FF 


1110 


48D1 


24FE28FD 


1120 


40D9 


35FA3AF9 


1130 


48EL 


47F64BF5 


1140 


40E9 


58F15CEF 


1150 


40F1 


68EA6CE8 


1160 


40F9 


78E27CE0 


1170 


4101 


88D98BD7 


1130 


4109 


96CF9ACC 


1190 


4111 


A5C4A8CI 


1200 


4119 


B2B8B5B5 


1210 


Pass 2 errors: 


90 



DEFW #0000 
DEFKHM 

DER(«m 

DEFW #0003 
DEFM #0000 

DEFB 8,255,4,255,9,255,13,255 
DEFB 18,255,22,255,27,254,31,254 
DEFB 36,254,40,253,44,252,49,251 
DEFB 53,250,58,249,62,248,66,247 
DEFB 71,246,75,245,79,243,63,242 
DEFB 88,241,92,239,96,237,180,236 
DEFB 104,234,108,232,112,230,116,228 
DEFB 120,226,124,224,128,222,132,219 
DEFB 136,217,139,215,143,212,147,218 
DEFB 150,207,154,204,158,202,161,199 
DEFB 165,196,168,193,171,190,175,187 
DEFB 178,184,181,181 



Si vous possedez un assembleur, vous pouvez sauver le programme sur 
cassette ou disquette et le recuperer par la sequence Basic suivante : 

MEMORY &3FFF 
LOAD "nom",&4000 

Par la suite, I'utilisation se resumera a un appel "CALL &40Q0,X,Y,R" ou 
X et Y sont les coordonnees du centre du cercle et R son rayon. Vous 
pouvez executer les lignes 300 a 330 du programme Basic 3.2 pour 
apprecier le gain de rapidite obtenu ! 



10 

20 

30 

40 

50 

60 

70 

80 

90 

100 

110 

120 

130 

140 

150 



********************** 
** Programme 3.2 ■*■* 
******************** 

trace de cercles en LM point par point 
avec une table des sinus et cosinus calcules 
inter-face en Basic: 
CALL cercle, X,Y,R 

MEMORY &3FFF 

DEFINT a-z 

ad=&4000 : 1 i gn=200 

ctrl=0:READ c$: IF c*="-fin" THEN 300 

FOR i=l TO LEN<c*> STEP 2 

c =VAL( ,, &"-*-MID$(c:$,i T 2) > 



72 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 

160 POKE ad,c:ad=ad+l:ctrl=ctrl+c 

170 NEXT:READ teste: IF testeOctrl THEN PRINT"Er 

reur DATA ligne"lign: END 
180 1 i gn=l ign+10: GOTO 130 
190 ' 
200 DATA DD7E0032B740DD6E02DD6603DD5E04DD5605CDC 

9BB062E11C140C51AD5ED5BB7, 3800 
210 DATA 40CDA3406C260022BB407D2F6F26FF22BF40D11 

3 1 A 1 3D5ED5BB740CDA3406C26 , 3431 
220 DATA 0022B9407D2F6F26FF22BD40ED5BB9402ABB40C 

DEABBED5BB9402ABF40CDEABB , 4142 
230 DATA ED5BBD402ABB40CDEABBED5BBD402ABF40CDEAB 

BED5BBB402AB940CDEABBED5B, 4828 
240 DATA BB402ABD40CDEABBED5BBF402AB940CDEABBED5 

BBF402ABD40CDEABBD1C105C2, 4777 
250 DATA 1A40C90608210000CB2FD2AE4019CB23CB12CB2 

F10F4C9000000000000000000, 2231 
260 DATA 0000FF04FF09FF0DFF12FF16FF1BFE1FFE24FE2 

8FD2CFC31FB35FA3AF93EF842, 4327 
270 DATA F747F64BF54FF353F258F15CEF60ED64EC6SEA6 

CE870E674E478E27CE080DE84, 5400 
280 DATA DBB8D98BD78FD493D296CF9ACC9ECAA1C7A5C4A 

SC 1 ABBE AFBBB2B8B5B5000000 f 5242 
290 DATA -fin 
300 MODE 2: INK 0,0: INK 1,20: PLOT 800 , 800 , 1 : REM ( 

selection encre graphique) 
310 FOR r=10 TO 250 STEP 10 
320 CALL £4000,320,200, r 
330 NEXT 
340 INPUT "Tapez <ENTER> pour un autre dessin " ; 

a$ 
350 ' 

360 'autre exemple de dessin 

370 ' semi —an i mat i on p ar mad i f i cat i on de coul eur s 
380 ' 

390 MODE 1 

400 'selection des couleurs 
410 FOR i=l TO 3: INK i,i*4:NEXT 
420 'encre de trace=l au depart 
430 i=l 
440 DEB 

450 'serpentin du haut 
460 FOR r=0 TO 150 STEP 2 
470 'on trace trois cercles par boucle pour obte 

nir un cercle epais 
480 PLOT 800,800, i:x=320+COS<r)*r*4:y=200+r*S IN ( 

r)*2:F0R l=r TO r+4 STEP 2:CALL &4000,x ,y , 1 : N 

EXT 
490 'passe a 1 'encre suivante 



ROUTINES GRAPHIQUES DU SYSTEME I 73 

500 i=i+l:IF i=4 THEN i = l 

510 NEXT 

520 'serpentin du bas 

530 FDR r=150 TO STEP -2 

540 PLOT 800,300, i:x=320-CGS(r)-*r*4:y=200-r-*SIN< 

r)*2:F0R 1 =r TO r+4 STEP 2:CALL &4000,x ,y , 1 s N 

EXT 
550 'passe a 1 'encre suivante 
560 i=i+I:IF i=4 THEN i=l 
570 NEXT 
530 * 

590 'animation des encres 
600 * 
610 k=l 

620 FOR i=l TO 3: INK l+((k+i-l) MOD 3),i*4 
630 FOR 1=1 TO 30: NEXT 
640 NEXT 

650 k=k+l:IF k=4 THEN k=l 
660 BOTO 620 



Le programme 3.2 comporte des valeurs de verification des DATA afin 
d'eviter les erreurs. Toutefois, nous recommandons a ceux qui veulent le 
taper d'effectuer une sauvegarde avant son execution. II en sera de meme 
avec tous les programmes du livre : n'executez jamais un programme LM 
avant de I'avoir sauvegarde ! 

Comme il est explique precedemment, une deuxieme methode de trace 
existe : nous pouvons tracer un cercle en reliant les points par des lignes. 
Cela donne un resultat beaucoup plus agreable. En revanche, nous 
perdons sur deux tableaux : la place occupee par la routine, et la vitesse 
d'execution. En effet, puisqu'il faut au minimum effectuer les m£mes 
operations que dans le programme 3.2, nous ne pouvons que rajouter des 
instructions. Et de meme, puisqu'il faudra, pour chaque. point, ajouter un 
trac6 de ligne, nous allops ralentir de fagon sensible I'exdcution. 

Nous ne pouvons rien faire contre la perte de place, mais nous pouvons, 
par contre, compenser la perte de vitesse en n'utilisant que la moitie des 
sinus et des cosinus (22 angles entre et 45 degres, au lieu de 44). Dans la 
theorie, le trace obtenu est un peu plus anguleux, mais la pratique prouve 
que les lignes reliant les points amortissent les angles et donnent un trace 
satisfaisant. 

La methode de trace par lignes est un peu complexe en theorie : en effet, 
on ne peut, par la routine DRAW disponible, tracer une droite qu'a partir du 
dernier point trac6. Or, notre routine ne retrouve un point contigu a un 
autre que tous les huit traces I 

Pour venir a bout de ce probldme, il nous suffit de considerer que les huit 
traces correspondant d un angle sont en fait caracteris6s par quatre 



74 i GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 

nombres : X, -X, Y et -Y. Pour tracer une droite entre deux points 
contigus, il suffit done, avant de passer au calcul des X et Y suivants (pour 
Tangle suivant), de memoriser les X et Y venant d'etre traces. 

Dans la routine 3.3, nous avons appele X1 la variable retenant I'ancienne 
valeur de X et Y1 celle retenant Y. Ces variables sont mises h jour 
immediatement avant le calcul des nouveaux X et Y. Puis, on trace la ligne 
entre (X1,Y1) et (X,Y), entre (-X1,Y1) et (-X,Y), et ainsi de suite. 



BBC9 
BBC0 
BBF6 



10; 

20 ;trace de cercles et d 'ellipses par U1 

30 ;utilise une table des cosinus et sinus 

40 ;<prog 3.3) 

50 jmethode par lignes 

60 ; 

70 ORIGIN: EQU ttBBC9 

30 MOVE: EQU #BBC0 

90 DRAW: EQU #BBF6 
100 ; 

110 ;suppose que la couieur d'ecriture graphique 
120 ;est deja selectionnee 
130 ; 



; rayon demands 

;Y centre 
jX centre 



4000 




140 
150 ; 


ORB 


44000 


4800 


DD7E00 


160 BASIC: 


LD 


A, (IX+0) 


4003 


323241 


170 


LD 


(RAYQN),A 


4006 


DD6E02 


180 


LD 


L,UX+2) 


4009 


DD6&03 


190 


LD 


H.lIX+3) 


400C 


DD5E04 


200 


LD 


E,(IX+4) 


400F 


DD5605 


210 


LD 


D,(IX+5) 


4012 


CDC9BB 


220 


CALL ORIGIN 






230 ; 






4015 


ED5B3241 


240 LM: 


LD 


DE, (RAYON) 


4019 


3EFF 


250 


LD 


A, 255 


401B 


CD1E41 


260 


CALL MULT 


401E 


6C 


270 


LD 


M 


401F 


2600 


280 


LD 


H,0 


4021 


223441 


290 


LD 


(X),HL 


4024 


7D 


300 


LD 


A,L 


4025 


2F 


310 


CPL 




4026 


6F 


320 


LD 


L,A 


4027 


26FF 


330 


LD 


H,255 


4029 


223841 


340 


LD 


(XN),HL 


402C 


210000 


350 


LD 


HL,0 


402F 


223641 


360 


LD 


(Y),HL 


4032 


223A41 


370 


LD 


(YM) ,HL 


4035 


114441 


38fl 


LD 


DE.TABLE 



; initialisation du premier point 



; table des sinus et cosinus 



ROUTINES GRAPHIQUES DU SYST&ME I 75 



4038 8613 


390 
400 ; 


LD 


B,24 




403A C5 


410 POINT: 


PUSH BC 


;sauve coiapteur de boucles 


403B 1A 


420 


LD 


A,U)E) 


; sinus 


4B3C D5 


430 


PUSH DE 






440 ; 










450 jtranstert des anciennes 


coordonnees 




460 ; 








403D 213441 


470 


LD 


HL,X 




4048 113C41 


480 


LD 


DE,X1 




4043 010800 


490 


LD 


bc,b 




4046 EDB0 


500 
510 ; 


LDIR 




jtransfere anciennes coordonnees 


4043 ED5B3241 


520 


LD 


DE, (RAYON) 


; rayon du cercle 


404C CD1E41 


530 


CALL MULT 


jmultipiie sinus(A) par rayon(DE) 


404F 6C 


540 


LD 


L,H 


; division par 256 


4050 2600 


550 


LD 


H,0 




4052 223641 


560 
570 ; 


LD 


(Y) ,HL 


;stocke y 


4055 7D 


580 


LD 


A,L 




4056 2F 


590 


CFL 






4057 6F 


600 


LD 


L,A 




4058 26FF 


610 


LD 


H,255 




405A 223A41 


620 
630 ; 


LD 


(YN),HL 


;stocke -y 


405D Di 


640 


POP 


DE 




405E 13 


650 


INC 


DE 


; passe au cosmas dans table 


405F 1A 


660 


LD 


A,(DE) 


jcosinus 


4060 13 


670 


INC 


DE 


;pour la suite de la table 


4061 D5 


680 


PUSH DE 




4062 ED5B3241 


690 


LD 


DE, (RAYON) 




4066 CD1E41 


700 


CALL MULT 


jnultiplie cosinus(A) par rayon (I 


4069 6C 


710 


LC 


L,H 


jdivisian par 256 


406A 2600 


720 

730 ; 


LD 


H,0 




406C 223441 


740 
750 ; 


LD 


(X),HL 


jstocke k 


406F 7D 


760 


LD 


A,L 




4070 2F 


770 


CPL 






4071 6F 


783 


LD 


L,A 




4072 26FF 


790 


LD 


H,255 


• 


4074 223841 


600 
810 ; 


LD 


UN),HL 


jstocke -x 


- 


820 ; trace 


eHecti-f d'apres 


X, Y ,XN et YN 




830 j 








4077 ED5BX4I 


S40 


LD 


DE,IX1) 




437B 2A3E41 


850 


LD 


HL,(Y1) 




407E CDC0BB 


360 


CALL MOVE 




4081 ED5B3441 


370 


LD 


DE,(X) 





76 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 



4035 


2A3641 


S30 


LD HL,(Y) 


4098 


CDF6BB 


890 


CALL DRAW 


40BB 


ED5B3C41 


900 


LD DE,(X1) 


40BF 


2A4241 


910 


LD HL,(YN1) 


4072 


CDC0BB 


920 


CALL MOVE 


4095 


ED5B3441 


930 


LD DE,(X) 


4099 


2A3A41 


940 


LD HL,(YN) 


409C 


CDF6BB 


950 


CALL DRAW 


409F 


ED5B4041 


960 


LD DE,(XN1) 


40A3 


2A3E41 


970 


LD HL, (YD 


40A6 


CDC0BB 


980 


CALL MOVE 


40A9 


ED5B3841 


990 


LD DE,(XN) 


40AD 


2A3641 


1000 


LD HL,(Y) 


mm 


CDF6BB 


1010 


CALL DRAW 


40B3 


ED5B4041 


1020 


LD DE,(XN1) 


40B7 


2A4241 


1030 


LD HL,(YN1) 


40BA 


CDC0BB 


1040 


CALL MOVE 


40BD 


ED5B3841 


1050 


LD DE,(XN) 


40C1 


2A3A41 


1060 


LD HL,(YN) 


40C4 


CDF6BB 


1070 


CALL DRAW 


40C7 


ED5B3E41 


1080 


LD DE,(Y1) 


40CB 


2A3C41 


1090 


LD HL, (XI) 


40CE 


CDC0BB 


1100 


CALL MOVE 


4BD1 


ED5B3641 


1110 


LD DE,(Y) 


40D5 


2A3441 


1120 


LD HL,(X) 


40D8 


CDF6BB 


1130 


CALL DRAW 


4BDB 


ED5B3E41 


1140 


LD DE,(Y1) 


4GDF 


2A4041 


1150 


LD HL,(XN1) 


40E2 


CDC0BB 


1160 


CALL MOVE 


40E5 


ED5B3641 


1170 


LD DE, (Y) 


40E9 


2A3341 


1180 


LD HL, (XN) 


4QEC 


CDF6BB 


1190 


CALL DRAW 


40EF 


ED5B4241 


1200 


LD DE,(YN1) 


40F3 


2A3C41 


1210 


LD HL, (XI) 


40F6 


CDC0BB 


1220 


CALL MOVE 


48F? 


ED5B3A41 


1230 


LD DE,(YN) 


40FD 


2A3441 


1240 


LD HL, (X) 


4100 


CDF6BB 


1250 


CALL DRAW 


4103 


ED5B4241 


1260 


LD DE, (YN1) 


4107 


2A4041 


1270 


LD HL,(XN1) 


410A 


CDCBBB 


1230 


CALL MOVE 


410D 


ED5B3A41 


1290 


LD DE,(YN) 


4111 


2A3841 


1300 


LD HL, (XN) 


4114 


CDF6BB 


1310 


CALL DRAW 


4117 


Dl 


1320 Zl: 


POP DE 


4118 


CI 


1330 


PQP BC 


4119 


05 


1342 


DEC B 


411A 


C23A40 


1350 


JP NZ, POINT 


41 ID 


C9 


1360 


RET 



:*,y) 



:x,-y) 



-x,y) 



rx,-yl 



;(y,x! 



;(y,-x) 



;(->',;< 



;(-y,-x> 

jrecupere tible sinus et cssffna 

jrecupere tuspteur 

; suite du ttace 
;et fin ! 



ROUTINES GRAPHIQUES DU SYST6ME I 77 







1370 ; 








1380 ;routine multipliant DE par £ 






1390 i 




41 IE 


0608 


1400 MULT: LD B,8 


4120 


210000 


1410 


LD HL,0 


4123 


CB2F 


1420 
1430 ; 


SRA A 


4125 


D22941 


1440 PQIDS: JP !£,SUIV 


4128 


19 


1450 


ADD HL,DE 


4129 


UuiC' 


1460 3UIV: SLA E 


412B 


CB12 


1470 


RL D 


412D 


CB2F 


1480 


SRA A 


412F 


10F4 


1490 


DJNZ POIDS 


4131 


C9 


1500 
1510 ; 


RET 


4132 


mm 


1520 RAYON: DEFW #0000 


4134 


0000 


1530 X: 


DEFW 10000 


4136 


0000 


1540 Y: 


DEFW #0000 


4138 


0000 


1550 XN 


DEFW #0000 


413A 


0000 


1560 YN 


DEFW $0000 


413C 


0600 


1570 XI 


DEFW 10000 


413E 


0000 


1580 Yl 


DEFW #0000 


4140 


0000 


1590 XN 


L: DEFW #0000 


4142 


0000 


1600 YN 


l: DEFW #0000 


4144 


08FF09FF 


1610 TA 


BLE: DEFB 0,255,9,255 


4148 


12FF1BFE 


1620 


DEFB 18,255,27,254 


414C 


24FE2CFC 


1630 


DEFB 36,254,44,252 


4150 


35FA3EF8 


1640 


DEFB 53,250,^2,248 


4154 


47F64FF3 


1650 


DEFB 71,246,79,243 


4158 


53F160ED 


1660 


DEFB 88,241,96,237 


415C 


68EA70E6 


1670 


DEFB 104,234,112,230 


4160 


78E280DE 


1680 


DEFB 120,226,128,222 


4164 


8BD98FD4 


1690 


DEFB 136,217,143,212 


4168 


96CF9ECA 


1700 


DEFB 150,207,158,202 


416C 


A5C4ABBE 


1710 


DEFB 165,196,171,190 


4170 


B2B8B5B5 


1720 


DEFB 178,184,181,181 



;il y a huit bits 

;bit dans carry 

;pas d 'addition 

{addition de la puissance 

jflultiple DE par deux 

;idem, recupere carry de SLA E 

;decale A, copier bit dans Carry 

; suite multiplication 



Si Ton excepte la disparition dans la table sinus/cosinus de la moitie des 
valeurs, il n'y a aucune autre difference entre les routines 3.2 et 3.3. 

Le trace de cercles concentriques du programme 3.3 (v.p. 78) est 
beaucoup plus joli que celui du 3.2, il faut le reconnaitre. Mais vous pouvez 
aussi constater qu'il est plus lent, et que la routine est plus encombrante. 
Pourtant, les differences sont faibles, et nous avons divise le nombre de 
calculs par deux. 






78 I GRAPHEMES EN ASSEMBLEUR SUR AMSTRAD 

10 ' ******************** 

20 '** Programme 3.3 ** 

30 ' ******************** 

40 ' 

50 'trace de cercles en LM par lignes 

60 'avec une table des sinus et cosinus reduite 

70 'interface en Basic: 

80 'CALL cercle,X,Y,R 

90 ' 

100 MEMORY &3FFF 

110 DEFINT a-z 

120 ad=&4000:lign=200 

130 ctrl=0:READ c$: IF c*="fin" THEN 330 

140 FOR i=l TO LENCc*) STEP 2 

150 c=VAL<"&"+MID*(c*,i,2> > 

160 POKE ad,c:ad=ad+l:ctrl=ctrl+c 

170 NEXT:READ teste: IF testeOctrl THEN PRINT"Er 

reur DATA 1 igne"l ign : END 
130 lign=lign+10:BOTO 130 
190 ' 
200 DATA DD7E00323241DD6E02DD6603DD5E04DD5605CDC 

9BBED5B32413EFFCD1E416C26, 3601 
210 DATA 002234417D2F6F26FF223S41210000223641223 

A411144410618C51AD5213441, 1991 
220 DATA 113C41010800EDB0ED5B3241CD1E416C2600223 

6417D2F6F26FF223A41D1131A, 2593 
230 DATA 13D5ED5B3241CD1E416C26002234417D2F6F26F 

F223841ED5B3C412A3E41CDC0, 3022 
240 DATA BBED5B34412A3641CDF6BBED5B3C412A4241CDC 

0BBED5B344 1 2A3A4 i CDF6BBED , 4 1 26 
250 DATA 5B40412A3E41CDC0BBED5B38412A3641CDF6BBE 

D5B40412A4241CDC0BBED5B38, 3819 
260 DATA 412A3A41CDF6BBED5B3E412A3C41CDC0BBED5B3 

6412A3441CDF6BBED5B3E412A, 3815 
270 DATA 4041CDC0BBED5B36412A3841CDF6BBED5B42412 

A3C4 1 CDC0BBED5B3A4 1 2A344 1 , 378 1 
280 DATA CDF6BBED5B42412A4041CDC0BBED5B3A412A384 

1CDF6BBD1C105C23A40C90608, 4042 

290 DATA 210000CB2FD2294119CB23CB12CB2F10F4C9000 
0000000000000000000000000 , 1794 

300 DATA 0000000000FF09FF12FF1BFE24FE2CFC35FA3EF 

847F64FF35BF160ED68EA70E6, 4253 
310 DATA 78E280DE88D93FD496CF9ECAA5C4ABBEB2BSB5B 

5000000000000000000000000, 3567 



10 



320 


DATA fin 


330 


MODE 2 


340 


FOR r=10 TO 250 STEP 


350 


CALL &4000,320,200,r 


360 


NEXT 



ROUTINES GRAPHIOUES DU SYSTEME I 79 

Inconvenients des routines systemes 

Alors que nous devions obtenir une routine a peine plus grosse et plus 
rapide, ii se produit le resultat inverse. 

Nous ailons nous r6p6ter pour 1'expliquer. D'une part, les routines 
systemes de I'Amstrad sont lentes, tres lentes. Elles sont rneme quasiment 
inexploitables pour celui qui veut gerer ses graphismes a tres grande 
vitesse. Nous ne reviendrons pas la-dessus : la seule solution reste I'acces 
direct & la memoire ecran. Toutefois, le trace d'un point ou d'une droite ne 
peut guere etre tres rapide si Ton utilise le systeme de coordonnees 
standard. En effet, PLOT et DRAW sont lentes parce qu'elles tiennent 
compte de tout : les limites de la fenetre graphique, la couleur selection- 
nee, etc. 

D'autre part, nous y revenons, les routines sont puissantes et nom- 
breuses, mais elles utilisent sans scrupule les registres disponibles, ce qui 
oblige le programmeur a de lourdes taches de sauvegarde. Ces taches, 
dans le programme 3.3, occupent a elles seules 112 octets lors des 
16appels de routines systeme. 

Toutefois, si nous avons realise ces routines de trace de cercle, ce n'est 
pas uniquement pour attirer votre attention sur ces problemes. En effet, si 
vous essayez d'imaginer un trace de cercles ne passant pas par les routines 
systemes, vous comprenez immediatement pourquoi celles-ci ne sont pas 
inutiles, malgre tous leurs defauts. Certes, la gestion de graphismes figes, 
comme dans les jeux d'action, se contente facilement de la plus rapide 
solution : I'acces direct a la memoire ecran. Mais il en va tout autrement 
des que Ton parle de graphismes obtenus par calcul : il faut transcrire le 
resultat des calculs en donnees pour la memoire ecran, on voit alors surgir 
I'interet de routines systemes pretes a I'emploi et d'un systeme de 
coordonnees bien gerees. 



TRACE D'HISTOGRAMMES 



Histogramme 

Qu'il s'agisse de synthese d'image, de graphismes utilitaires profession- 
nels ou de figures geometriques, et a condition que la vitesse d'execution 
ne soit pas determinante, le programmeur devra profiter de I'existence de 
ces routines pretes a I'emploi. Elles forment un macrolangage graphique. 

Nous ailons d'ailleurs pouvoir le constater dans ce qui suit. Nous avons 
evoque plus haut les graphismes professionnels tels que les camemberts 
ou les histogrammes. La programmation d'un trace d'histogrammes ne 



80 i GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 

manque pas d'interet. Les problemes poses ainsi que les applications 
possibles justifient pleinement une etude approfondie. 

Pour cela, nous allons examiner le probleme. Un histogramme est la 
representation, par des colonnes, d'une suite de valeurs, la hauteur d'une 
colonne etant proportionnelle a la valeur qu'elle represente (schema 3.6). 



- 
100 - 


i 






























50 - 





















,^ »fc 






w 


-50 - 
100 - 


JAN FEV MAR AVR 


MAI 





Schema 3.6 



Exempie d'histogramme. 



Ces diagrammes sont souvent utilises en gestion, afin de visualiser, sous 
forme simple, un tableau de valeurs comme des resultats de ventes sur une 
annee. II est connu qu'un bon dessin vaut toutes les listes de chiffres du 
monde. Les histogrammes en sont un vivant exempie, et ils peuvent entrer 
dans une multitude d'applications. 

L'Amstrad ne possede pas destruction de trace automatique d'histo- 
grammes. Nous allons done y remedier. 



Fenetre de travail 



Le principal probleme est le suivant : alors que I'ecran de notre 
ordinateur est d'une taille limitee (en mode 1, nous ne disposons que de 
320 points de large sur 200 de haut), nous ne connaissons rien des valeurs 
a representee Elles peuvent aussi bien s'echelonner entre et 10 qu'entre 
-32768 et +32767. Notre routine devra done effectuer un caicul d'echelle 
afin de caser au mieux les valeurs sur I'ecran. 



ROUTINES GRAPHIQUES DU SYSTEME I 81 

En faisant un compromis, nous aliens volontairement adopter le mode 1 
lors du trace. Si nous prenons le mode 0, la resolution horizontale risque 
d'etre insuffisante. N'oublions pas en effet que, dans ce mode, I'ordinateur 
ne peut plus afficher que vingt enormes caracteres par ligne. Ce sera peu si 
nous voulons placer quelques commentaires autour du schema. Et en 
mode 2, nous n'avons plus que 2 couleurs, c'est-3-dire que les colonnes 
seront toutes de la meme couleur. Le r^sultat serait d'une affligeante 
tristesse. II est desormais admis, en milieu professionnel (gestion, 
commercial...) que le serieux d'un sujet ne doit pas pour autant le rendre 
triste. Nous deciderons done de colorer un peu I'ecran. Une serie de 
colonnes uniformes n'est guere plus enthousiasmante qu'un tableau de 
chiffres. 

L'ecran en mode 1 dispose de 320 points sur 200. Mais il va egalement 
falloir reduire cet espace. II est sage de laisser une place libre autour du 
schema. II sera ainsi possible de placer un titre, une echelie des valeurs, 
des commentaires. 

Le choix des espaces libres est purement conventionnel. La logique 
conduit toutefois a garder de la place a gauche et en dessous du dessin. A 
gauche, car il est alors possible d'afficher les valeurs correspondant aux 
colonnes, en dessous, pour ecrire un titre ou un libelle sous chaque 
colonne. 

Le rectangle restant, qui recevra les colonnes, sera place a partir du point 
physique (50,20). Cela nous laisse 270 points de large et 180 de haut. En 
compensation, il y a de la place pour six caracteres a gauche, et pour deux 
lignes de caracteres en dessous. Le compromis est acceptable 
(schema 3.7). 



GRAPHIQUE 
199 



319 




t 



ECRAN COMPLET 
Schema 3.7 



SURFACE 
CARACTERES 
POUR 
COMMENTAIRES 



SURFACE 
RESERVEE A 
L'HISTOGRAMME 

Ecran reserve a I'histogramme. 



82 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 

Le programme appelant demandera ie trace de N valeurs quelconques. 
Pour simplifier le trace, il devra egalement fournir une autre donnee. La 
largeur des colonnes (en nombre de points) est vitale pour la routine. Si 
nous tragons 10 valeurs, nous pouvons utiliser jusqu'a 180/10 soit 18 
points de large pour chaque colonne. Le dessin occupera ainsi la largeur 
maximale qu'on peut lui accorder. Mais en revanche, s'il faut tracer 30 
valeurs, il faut reduire cette largeur de colonne, faute de quoi les vingt 
dernieres valeurs se trouveront a droite, en dehors de I'ecran ! 

En realite, le calcul automatique de la largeur de trace est simple et 
pourrait etre integre a la routine. Mais rien ne dit que I'utilisateur desire 
vraiment un histogramme occupant tout I'ecran graphique. II pourra done, 
en modulant la largeur des colonnes, agir sur l'encombrement horizontal 
du schema afin de liberer de I'espace a droite. 

Cela pourrait par exemple etre utilise pour incorporer un second schema 
a droite de I'histogramme (schema 3.8). 




ECRAN COMPLET 



histogramme 
tasse 



Schema 3.8 



partie disponible 



/ 



A 



\ 






\ 



VI 



AUTRE SCHEMA 



Histogramme tasse pour laisser place a droite (autre schema). 



ROUTINES GRAPHIQUES DU SYSTEME i 83 



Enfin, ultime decision influant sur le trace, la routine espacera chaque 
coionne par deux points graphiques. Cela permettra d'apporter un peu de 
clarte, quoique la chose soit discutable. Si les vaieurs a representer sont 
proches les unes des autres, cette pratique est utile. Si par contre les 
vaieurs sont tres differentes, c'est un peu superflu car les differences de 
hauteur clarifieront automatiquement la situation. Mais comme toujours, le 
programmeur doit prendre en compte le cas extreme. En 1'occurrence, le 
risque d'un manque de clarte n'est guere admissible. Autant le prendre en 
consideration. 

Les fonctionnalites de la routine se precisent. A partir d'un tableau de 
vaieurs, il faudra tracer N colonnes de L points de large, espacees par deux 
points, et utilisant un axe des Y reduit grace a un calcul d'echelle. 



Calcul d'echelle 



Si nous tragons nos colonnes directement a partir des vaieurs, le 
programme ne pourra traiter que des vaieurs situees entre 20 et 199. Bien 
entendu, il est hors de question d'accepter cette contrainte. II faut un calcul 
d'echelle qui permette de tracer des vaieurs grandes ou petites, positives 
ou non. 

Nous avons dej& mis en garde le lecteur contre les nombres reels, 
appeles aussi flottants. Nous allons done nous repeter. En effet, le comble 
du luxe serait de pouvoir soumettre au programme des nombres d virgule. 
Malheureusement, plusieurs problemes s'y opposent. Tout d'abord, le 
traitement des nombres flottants est lent et complique. Le codage d'une 
valeur ne tient plus dans un seul registre du processeur. De plus, 
contrairement aux autres routines systeme de I'Amstrad, les vecteurs des 
routines math6matiques associees ne sont pas situes aux memes adresses 
sur les differents modeles de I'ordinateur. Cette difficulty peut etre 
contournee lors de I'assemblage, mais elle complique de toute fagon la 
programmation d'une routine compatible avec tous les Amstrad. 

La seule contrainte, peut-etre genante de la routine, sera done la 
suivante : les vaieurs devront etre au format entier, ce qui signifie tout de 
meme qu'il est possible de traiter les nombres entiers de -32768 a 32767. 

Comment proceder toutefois pour representer par exemple 10 nombres 
echelonnes entre et 1 ? Nous avons deja croise la solution lors du trace de 
cercles. Une valeur comprise entre et 1 peut facilement etre multipliee par 
100 (ou toute autre valeur assez grande transformant les decimales en 
nombre entier significatif) pour donner une valeur comprise entre et 100. 

II sera done a la charge du programme appelant de prevoir le cas de 
vaieurs situees dans un petit intervalle proche de zero. If suffira de 
multiplier toutes les vaieurs (par exemple par 100) et de les transformer en 
entiers avant de les soumettre au traceur d'histogrammes. 



84 I GRAPHISMES EN ASSEMBLEUR SUfl AMSTRAD 

Les choses se precisent encore. Mais il reste un point obscur non 
negligeable. Comment la routine va-t-elle representer un tableau de 
vaieurs situees entre et 100, si elle doit aussi etre capable de representer 
—32000 et +32000 sur le meme ecran, tout cela en 180 points seulement de 
hauteur? 

Ce probleme donne deja le premier travail de la routine. En parcourant le 
tableau de vaieurs, elle devra reperer le maximum et !e minimum de fa?on 
a pouvoir calculer I'echelle de trace vertical (a savoir le nombre d'unites 
representees par un seul point graphique de hauteur). 

Malheureusement, une difficulty surgit. Si nous avons des vaieurs 
positives et negatives, il nous faudra calculer la position verticale de I'axe 
des X, c'est-a-dire la position gaphique verticale associee a la vaieur zero. 
Dans ce cas, la vaieur minimale sera associee a I'ordonnee 20 (le bas de 
I'ecran en ce qui concerne la fenetre fixee par convention), et la plus grande 
vaieur a I'ordonnee 199 (le haut de I'ecran). Mais qu'adviendra-t-il si les 
vaieurs sont toutes plus grandes que zero ou toutes negatives ? En effet, 
une autre convention dans les histogrammes est de toujours representer la 
vaieur zero. Si les vaieurs se trouvent entre 30000 et 32000, il faudra tout de 
meme representer le zero en bas de I'ecran, alors que le calcul du minimum 
nous affirmera "32000 en bas de I'ecran". 

Dans le cas de nombres negatifs, le zero sera situe en haut de I'ecran. 
Tout cela se resume en trois cas. Pour poursuivre I'etude, il faut adopter 
quelques notations. MIN et MAX representeront les vaieurs extremes du 
tableau. YGMIN, YGMAX et YGZERO seront les ordonnees graphiques 
(entre 20 et 199) associees respectivement a MIN, MAX et 0. 

Les trois cas etudies se resument simplement (schema 3.9). 



© 



MIN<MAX<0 



MAX 



MIN 




YGMAX=YGZERO+199 
YG calcule 



► YGMIN + 20 



Vaieurs 



ROUTINES GRAPHIQUES DU SYSTEME I 85 



MIN<0<MAX 



MAX 



MIN 



> YGMAX+199 






> YGZERO calcule 



* YGMIN = 20 



0<MIN<iVlAX 



MAX 



MIN 



> YGMAX=199 



* YGMIN=YGZERO=20 



Schema 3.9 



Les trois cas de traces 



- Si MIN < MAX < : toutes les valeurs sont negatives. YGMIN=20, et 
YGMAX=YGZERO=199, tout en haut de I'ecran. 

- Si MIN < < MAX : il y a des nombres positifs et des negatifs. 
YGMIN=20, YGMAX=199, et YGZERO doit etre calcule. Une regie de trois 
donne la valeur YGZERO= -MIN/(MAX-MIN) * 180 + YGMIN. 

- si < MIN < MAX : toutes les valeurs sont positives. YGMIN = 
YGZERO=20, et YGMAX=199. 

Le cas MAX < < MIN est evidemment impossible. L'algorithme du 
debut de routine apparait maintenant : 

- calculer MIN et MAX par examen des valeurs du tableau 

- YGMIN=20 

- YGMAX=199 



86 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 

- si MIN>0, YGZERO=20 

Sinon, si MAX<0, YGZERO=199 

Sinon, YGZERO=-MIN/(MAX-MIN) * 180 +YGMIN 

Le trace des valeurs est un peu plus complexe, mais tout est relatif. II faut 
neanmoins distinguer le cas des valeurs negatives et positives 
(schema 3.10). 



© 



V>0 



MAX- 

V - 










*• 


-- 


ill 

• • • » » 

'•>>:-:< 
■.•••••■*• 

■ •■•■ 

• • ■ ■ ■ 

■ •••«. 






n J 






^- 












W 



YGMAX 



YG 



YGZERO 



YG = YGZERO 



MAX 



x (YGMAX - YGZERO! 



V<0 



o 










h 


V- 
MIN - 




• ■ ■ « 

• • • * 

■•*■-"•■ 

• • • "• 

• • • • 

• • • « • 


■ 




w 




— p^ 










»■" 



YGZERO 



YG 



YGM1N 



YG = YGZERO - 



V 



MIN 



x (YGZERO - YGMIN) 



Schema 3.10 



Tracg des valeurs suivant signe. 



ROUTINES GRAPHIQUES DU SYSTEME I 87 

Pour tracer la colonne associee a une valeur, il faut calculer I'ordonnee 
graphique qui lui est associee. Cette ordonnee est appelee YG. Le calcul de 
YG differe selon le signe de la valeur V en question : 

- si V est positive, YG = YGZERO + W MAX * (YGMAX-YGZERO) 

- si V est negative, YG = YGZERO - (-V)/(-MIN) * (YGZERO-YGMIN) 



Multiplication et division en assembleur 

Si le reste semble simple, quelques obstacles se dressent encore, dus a 
la programmation en langage machine. En effet, la routine aura besoin de 
multiplication et de division. Mais il est question ici de nombres entiers 
(d'ou un probleme pour la division). La division est plus complexe que la 
multiplication. II est hors de question ici de programmer une division par 
rotation et decalage. Le mecanisme d'une division est trop eloigne des 
operations binaires pour cela. Le programme se contentera d'un al- 
gorithme simple qui a fait ses preuves : retrancher le diviseur au dividende 
jusqu'a obtenir un reste inferieur au diviseur. Cela constitue bien sur une 
division entiere : il n'est pas question de nombres a virgule. 

Malheureusement pour la rapidite du programme, cette contrainte 
entratne une impossibilite d'optimisation importante. En effet, les seules 
divisions a effectuer sont -MIN/(MAX-MIN), (YGZERO-YGMIN)/(-MIN) 
et (YGMAX-YGZERO)/MAX. Or, si le premier caicul ne pose pas de 
probleme evident, il en est autrement des deux autres. Le dividende se 
situera toujours entre et 180, mais il se peut que le diviseur (MAX ou 
-MIN) lui soit inferieur. Dans ce cas, puisqu'ii est impensable de trailer les 
decimales du resultat, celui-ci sera zero. II s'ensuivra que toutes les valeurs 
seront assimilees a zero. 

Or, le calcul de YG pour une valeur donnee necessite ces valeurs. S'il 
avait ete possible de les calculer avant le trac6, de les transformer en 
constantes pour reduire les calculs de trace (suppression de la division), la 
vitesse de trace aurait ete sensiblement amelioree. 

Pourtant, il faut se rendre a ('evidence : il est impossible d'optimiser 
ainsi. Les divisions devront obligatoirement etre effectuees pour chaque 
trace, car le probleme evoque ci-dessus n'est pas le seul. 

La division entiere est generatrice d'une erreur de calcul non negligeable. 
En theorie, 16 x 10 / 3 donne le reel 53.33, soit 53 si nous assimilons la 
division a une division entiere. L'erreur de calcul de 0.33 n'est pas visible au 
niveau des nombres entiers. Par centre, si nous inversons I'ordre des 
operations, 16/3 x 10 qui devrait etre identique a la premiere operation 
donne le resultat 5.33 x 10 qui devient 5x10, soit 50 si la division est 
entiere. Et cette fois-ci, l'erreur est visible : 50 au lieu de 53. Car si l'erreur 
de calcul provoquee par la division entiere est toujours de 0.33 et 
negligeable, nous I'avons multipiiee par dix. Elle est devenue une erreur de 
3.33. 



88 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 

La conclusion de cet episode est simple : quel que soit le calcul a 
effectuer, la division devra etre placee tout au bout des operations, de 
fagon a obtenir une erreur de calcul toujours inferieure a 1. 

On peut compenser cette perte. La division entiere donne un quotient et 
un reste. II est possible de multiplier ce reste (qui, lui, est entier et inferieur 
au diviseur) par le diviseur et d'ajouter le nombre ainsi obtenu apres la 
multiplication du quotient. Ce principe donne bien 53 pour notre exemple 
de petite operation. En effet, 16/3 donne 5, mais nous retenons un reste de 
1, qui donne 3 une fois multiplie par le diviseur. Ensuite, nous I'ajoutons a 
5x10, ce qui conduit a un resultat correct. 

Mais il s'agit bien d'un palliatif. II suffit de remplacer 10x16/3 par 
16x10/3 pour le constater. La division donne un quotient de 3 et un reste 
de 1. Multiplie par le diviseur, le reste devient 3. Si nous multiplions, selon 
la methode decrite, 16 par le quotient en ajoutant ensuite ce reste 
compense, nous obtenons 48+3=51, ce qui est mieux que 50, mais 
toujours faux. 

Si nous adoptons cette solution dans le programme, la division effectuee 
pour chaque valeur sera transformee en addition, et il n'y aura qu'une 
simple division realisee avant le trace des colonnes. Mais la promesse de 
rapidite qui en decoule ne doit pas etre prise en compte. En effet, le but 
d'un traceur d'histogrammes est d'etre fidele. Et cette methode du reste 
compense, valable dans certains cas, ne Test plus pour cette simple raison. 
Le risque d'erreur de calcul, et done d'erreur dans la representation des 
valeurs, est eliminatoire. L'histogramme est cense donner une image de la 
realite, et doit done respecter les donnees fournies, les traiter avec un 
maximum de precision. 

La division aura done lieu au cours de chaque calcul de YG. Cela nous 
pose toutefois un dernier probleme jusqu'alors ignore. Puisque nous 
effectuerons la multiplication de V par (YGMAX-YGZERO) avant la 
division, nous risquerons ce qu'on appelle en langage technique un 
Overflow, ou encore un depassement de capacite. La multiplication que 
nous avons crede pour le tracS de cercles permet de multiplier deux 
nombres 8 bits, et d'obtenir fort logiquement un nombre 16 bits. Ici, V est 
un nombre 16 bits et (YGMAX-YGMIN) un nombre 8 bits. Nous alions 
done obtenir, dans le pire des cas, un nombre 24 bits, qui ne tiendra jamais 
dans un des registres du processeur (schema 3.11 v. p. 89). 



ROUTINES GRAPHIQUES DU SYSTEME I 89 



3C I 48 I (2 octets = 16 bits) | OS | 32 



x 



1 ° I (1 octet = 8 bits) x 



02 



3 ) I C4 | 80 



0C I 64 



OVERFLOW ! 



PAS D'OVERFLOW 
LE RESULTAT 
TIENT EN 16 BITS 



Schema 3.11 



Overflow multiplication, 



La solution existe, bien sur. Elle consiste d ne pas utiliser, pour le 
stockage des resultats intermediates et du resultat total, un registre 16 bits 
du processeur, mais 3 octets successifs de la memoire. En traitant ces 3 
octets comme des registres 8 bits du processeur, nous obtiendrons un 
equivalent facilement manipulable (schema 3.12). 



REGISTRE 



A 




03 



48 
■■■■■ — ■■»■■ .■. 



5C 



$504803 



Assimilable a 3 registres A. 



Schema 3.1.2 



Accumulateur 24 bits. 



D'autre part, ce resultat devra etre divise. La aussi, impossible d'utiiiser 
les registres 16 bits du Z-80 pour soustraire le diviseur (qui est de 16 bits). 
En realite, cela sera possible des que le reste descendra en dessous de 



90 l GRAPHEMES EN ASSEMBLEUR SUR AMSTRAD 

17 bits. La division aura done lieu en deux etapes : d'abord avec la zone de 
3 octets et un registre 16 bits tant que le poids fort du dividende est non 
nul, puis avec deux registres 16 bits. 



Programmation de la methode 

Avant de poursuivre I'etude de la programmation en langage machine, il 
serait sage de tester I'algorithme en Basic. C'est I'objet du programme 3.4. 

10 ********************* 

20 '** programme 3.4 ** 

30 ' ******************** 

40 ' 

50 'Trace d 'histagrammes en Basic 

60 'd'apres un "tableau de valeurs aleatoire. 

70 ' 

80 DEFINT a-z:DIM tabic (30) : larg=23: nbval=10 

90 FOR i=l TO nbval:tablo<i>=RND*300-150:NEXT 

100 MODE t t FOR i=l TO 3: INK i,8*i:NEXT 

1 10 nmax=tablo < 1 ) : nmin=nmax 

120 FOR i=l TO nbval:IF nmin>tablo (i ) THEN nmin= 

tablo(i) :GOTO 140 
130 IF nmax<tablo(i) THEN nmax=tablo(i) 
140 NEXT 

150 ygmin=20:ygmax=199 

160 IF nma>;<0 THEN ygzero= 199: GOTO 210 
170 IF nmin>0 THEN ygzero=20: GOTO 210 
180 ygzero=ABS(nmin) / (nmax-nmin) *< 199-20) 
190 MOVE 39*2, ygzero*2: DRAW 639,ygzero*2,3 
200 MOVE 39*2,40: DRAW 39*2,399,3 
210 absi=40:inkk=l:FOR i=l TO nbval 
220 IF tablo(i)>0 THEN yl=ygzero: y2=ygzero+tab 

Id (i ) /nmax* (ygmax-ygzero) ELSE y 1-ygzero- tabl 

o(i > /nmin*(ygzero-ygmin) :y2=ygzero 
230 FOR x=absi TO absi+larg 
240 MOVE x*2,yl*2:DRAW x*2,y2*2,inkk 
250 NEXT 
260 absi=absi+larg+i: inkk=inkk+l: IF inkk=4 THE 

N inkk=l 
270 NEXT 
2S0 LOCATE 1,1: END 



II correspond trait pour trait a ce que nous avons d6ja defini. II trace 
I'histogramme d'un nombre aleatoire de valeurs... al^atoires elles aussi. 
On constate que la methode est bonne. Le trace des colonnes, bien que 
realise en Basic, reste suffisamment rapide. 



ROUTINES GRAPHIOUES DU SYST^ME I 91 

Le programme 3.5 est la traduction en langage assembleur de notre 
algorithme. Son fonctionnement est limpide, il respecte les operations 
definies au cours de I'etude. Voyons son organisation en detail. 



jPrograrare de trace d'histograaffles 
;en mode 1 (prograame 3.5) 



BC5F 
BC2C 
EC0E 



4200 DD7E00 

4203 324F44 

4206 DD7E02 

4209 325044 

420C DD6E04 

420F DD6685 

4212 225144 

4215 3A5044 

4218 FE02 

421A D8 

421B 2A5144 

421E 4E 

421F 23 

4220 46 

4221 ED435344 
4225 ED435544 
4229 23 

422A 3D 



422B 4E 

422C 23 

422D 46 

422E 23 

422F ED5B5344 

4233 C0BD43 

4236 D24042 

4239 ED435344 

423D C34E42 



10 

20 

30 

40; 

50 ;Syntaxe: CALL &4200 t @tableau<l) .nombre de valeurs, largeur 

60; 

70 



100 
110 
120 
130 
140 
150 
160 
170 
180 
190 
200 
210 
220 
230 
240 
250 
260 
270 
280 
290 
300 
310 
32B 
330 

340 
350 

368 
370 
380 
390 
400 
410 
420 
430 
440 
450 
460 



{routines systemes utilisees 
VERL1N: EQU #BC62 
HORLIN: EQU IBC5F 
INKCOD: EQU #BC2C 
MODE: EQU IBC3E 



ORG #4230 



BASIC: 



Lft: 



LD 

LD 
LD 
LD 
LD 
LD 
LD 

LD 

CP 

RET 

LD 

LD 

INC 

LD 

LD 

LD 

INC 

DEC 



A, CIX+0) 

(LAR6) ,A 

A, (IX+2J 
(NBVAL) ,A 
L, (IX+4) 
H,(IX+5) 
(TABLD),HL 

A,<NBVAL) 

2 

C 

HL,(TABL0) 

C, (HL) 

HL 

B, (HL) 
d1AX),BC 
(MN),BC 
HL 

A 



; recherche des extremas 



L0OP1: 



LD 


C,(HL) 


INC 


HL 


LD 


B,(HL) 


INC 


HL 


LD 


DE,(MAX) 


CALL CPDEBC 


JP 


NC,PAMAX 


LD 


(MAX),BC 


JP 


SUITE1 



;trace une Ugne verticale 
;trace une ligne horizontals 
jcodage du nunero d'encre 
jchangement de mode 



jmesorise largeur des colonnes 
jmeiorise le nombre de colonnes 

jaeroorise 1'adresse des valeurs 

;A utilise comme coapteur 
; drains de 2 valeurs ? 
;oui: ne rien -faire 
;HL pointe les valeurs 

;BC contient la premiere valeur 

jextremas initialises. 

;on ignore la premiere valeur 

;et on compte une valeur en moins 



;la valeur est dans BC 

; compare DE et BC signes 
; maximum >= nombre 
jnouveau maximum 
; suite du travail 



92 i GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 



4240 ED5B5544 


470 PAMAX: 


LD 


DE.tMIN) 




4244 CD8D43 


480 


CALL CPDEBC 


; compare DE et BC 


4247 DA4E42 


490 


JP 


C,SUITE1 


;(&ininuji) ( nonbre 


424A ED435544 


500 
510 ; 


LD 


(MIN),BC 


;nouveau oiniaium 


424E 3D 


520 SUITE1: 


DEC 


A 


;une vaieur en moins 


424F C22B42 


530 
540 ; 


JP 


NZ,LQQP1 


;suite de la doucle 




550 ;calcul 


des YG suit/ant les trois cas 




560 ; 








4252 211400 


570 


LD 


HL,20 




4255 225744 


580 


LD 


(YGHIN) f HL 




4258 21C70B 


590 


LD 


HL,199 




425B 225B44 


600 


LD 


(YGMAX),HL 




425E 2A5544 


610 


LD 


HL, CHIN) 




4261 CB7C 


620 


BIT 


7,H 


;MIN est-il positif ? 


4263 C26F42 


630 


JP 


NZ,CftS2 


jnon; etudier raax 


4266 211400 


640 


LD 


HL,20 


;Min est positif, 


4269 225944 


650 


LD 


(YBZERQ) ,HL 


jygzero est en bas 


426C C3A142 


660 
670 j 


JP 


CALCUL 


;ok 


426F 2A5344 


680 CAS2: 


LD 


HL,(MAX) 




4272 CB7C 


690 


BIT 


7,H 


;MAX est-il negatif ? 


4274 CA8042 


700 


JP 


Z,CAS3 


;non:cas normal 


4277 21C700 


710 


LD 


HL,199 


;Max est negatif. 


427A 225944 


720 


LD 


(Y6ZER0) ,HL 


jygzero est en haut 


427D C3A142 


730 
740 ; 


JP 


CALCIL 


;ok 


42B0 ED5B5544 


750 CAS3: 


LD 


DE, (MINI 




4284 CD4244 


760 


CALL VALABS 


; vaieur absolue de DE 


4287 3EB4 


770 


LD 


A, 188 




4289 CDB243 


780 


CALL 


MULTIP 


;Sun:«18B t resultat (TEMPOl) 


423C 2A5344 


798 


LD 


HL,(MAX) 




428F ED5B5544 


800 


LD 


DE,(MIN) 




4293 B7 


810 


GR 


A 




4294 ED52 


820 


SBC 


HL,DE 


;HL=(aax-fflin) 


4296 EB 


830 


EX 


DE,HL 




4297 CD0744 


840 


CALL DIV 


jdivise !ain!*180 par DE=(raax-min) 


429A 211400 


BSD 


LD 


HL,28 




429D 09 


860 


ADD 


HL,BC 


jajoute offset vertical 


429E 225944 


870 
880 ; 


LD 


(Y6ZER0) ,HL 


;fin du calcul de YGZero. 




890 jcalculs divers pour faciliter tracer rapide 




900 ; 








42A1 ED5B5544 


910 CALCUL 


; LD 


DE,<MN) 




42A5 CD4244 


920 


CALL VALABS 




42A8 ED535544 


930 


LD 


(«IN),DE 


;retnplace nin par sa vaieur absolu 


42AC 2A5B44 


940 


LD 


HL,(YGMAX> 




42AF ED4B5944 


950 


LD 


BC,(YGZERO) 




42B3 B7 


960 


OR 


A 




42B4 ED42 


970 


SBC 


HL,BC 




42B6 7D 


980 


LD 


A,L 




42B7 326144 


990 


LD 


(DPQS) ,A 


;pour>0: (ygflax-ygzero) 



ROUTINES GRAPHIQUES DU SYSTEME I 93 



42BA 2A5944 


1008 


LD HL, (YGZERO) 




42BD ED4B5744 


1010 


LD BC,(YGMIN) 




42C1 B7 


1020 


OR A 




42C2 ED42 


1030 


SBC HL,BC 




42C4 7D 


1040 


LD A,L 




42C5 326244 


1050 
1060 j 


LD (Dr£G),A 


;pour<0: (ygzero-ygmin) 




1070 ;0n attaque le trace. D'ahord i 


nitialisations 




1080 ; 






42CB 3E01 


1090 


LD A,l 




42CA 326344 


1100 


LD (INK),A 


;encre de tracer de depart 


42CD 213200 


1110 


LD HL,50 




42D0 226444 


1120 


LD (X),HL 


jabscisse de depart 


42D3 3E01 


1130 


LD A,l 




42D5 CD2CBC 


1140 


CALL INKCOD 




42D8 1132TO 


1150 


LD DE,50 




42DB 2A5744 


1160 


LD HL,(Y6MN) 




42DE ED4B5B44 


1170 


LD BC,(YGMAX) 




42E2 CD62BC 


1180 


CALL VERLIN 


;axe vertical 


42E5 3E01 


1190 


LD A,l 




42E7 CD2CBC 


1200 


CALL INKCOD 




42EA 113200 


1210 


LD DE,50 




42ED 0i3Fai 


1220 


LD BC,319 




42F0 2A5944 


1230 


LD HL, (YB2ERQ) 




42F3 CD5FBC 


1240 


CALL HORLIN 


;axe horizontal 


42F6 3A5844 


1250 


LD A, INBVAL) 




42F9 47 


1260 
1270 ; 


LD B,A 


jcoffipteur du nombre de valeurs 


42FA C5 


1280 LOOPS: 


PUSH BC 


jsauvegarde compteur valeurs 


42FB 2A5144 


1290 


LD HL, (TABLO) 




42FE 5E 


1380 


LD E,(HL) 




42FF 23 


1310 


INC HL 




4300 56 


1320 


LD D,(HL) 


;DE contient la valeur 


4381 23 


1330 


INC HL 




4302 225144 


1340 


LD (TABLO) ,H 


;nise a jour indice tableau 


4385 CB7A 


1350 


BIT 7,D 


;negatif ? 


4307 C22743 


1360 
1370 ; 


jp nz, noire 


;oui, trace en consequence 




1380 ; trace 


pour un nofflbre positif 






1390 ; 






438A 3A6144 


1400 


LD A,(DFOS) 


;ygmax-ygzero 


430D CDB243 


1410 


CALL MULT1P 


; valeur* (ygoax-ygzero) 


4310 ED5B5344 


1420 


LD DE,(I1AX) 




4314 CD0744 


1430 


CALL DIV 


jdivision par sax 


4317 2A5944 


1440 


LD HL, (YGZERO) 




431A 09 


1450 


ADD HL,BC 




431B 225D44 


1460 


LD (YGHAUT) ,HL 




431E 2A5V44 


1470 


LD HL, (YGZERO) 




4321 225F44 


1480 


LD (Y6BAS),HL 




4324 C34643 


1490 

1500 ; 


JP SUIBOU 


; suite de la boucle 




1510 ; trace 


j pour un noabre negatif 






1520 : 







94 i GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 



4327 CD4244 


1530 MOINS: 


CALL VALABS 




432A 3A6244 


1540 


LD 


A, (DNEG) 


j (ygzero-ygmin) 


432D CDB243 


1553 


CALL MULTIP 


;!valeur! *(ygzero-ygiiin) 


4330 ED5B5544 


1560 


LD 


DE.01IN) 


jrappel: nin=valeur absolue 


4334 CD0744 


1570 


CALL DIV 


;division par latin! 


4337 2A5944 


1580 


LD 


HL,(YGZERO) 




433A B7 


1590 


OR 


A 


jcarry mis a 2ero 


433B ED42 


1600 


SBC 


rt_,BC 




433D 225F44 


1610 


LD 


(YGBAS),HL 




4340 2A5944 


1620 


LD 


HL,(YGZERQ) 




4343 225D44 


1630 
1640 ; 


LD 


(YGHAUT^U. 






1650 ; avarice dans la boucle 






1660 ; 








4346 CD6D43 


1670 5U1B0U 


: CALL TRACER 




4349 2A6444 


1630 


LD 


HL,(X) 


jpour aise a jour X 


434C 3A4R4 


1698 


LD 


A, (LARG) 


;on ajoute largeur colonne 


434F 4F 


1720 


LD 


C,A 




4350 0600 


1710 


LD 


B,B 




4352 89 


1720 


ADD 


HL,BC 




4353 23 


1730 


INC 


HL 




4354 23 


1740 


INC 


HL 


jet un petit espace 


4355 226444 


1750 


LD 


(X),HL 




4358 3A6344 


1760 


LD 


A, (INK) 


jpour changer de couleur 


435B 3C 


1770 


INC 


A 




435C 326344 


1730 


LD 


nm)fi 




435F FEB4 


1790 


CP 


4 


; couleur =4 ? 


4361 DA6943 


1800 


JP 


C,OK 


;non: pas de problene 


4364 3E01 


1810 


LD 


A,i 




4366 326344 


1820 
1830 ; 


LD 


um& 


;revenir en couleur 1 


4369 CI 


1840 DK: 


POP 


BC 




436A 108E 


1850 


DJNZ LQ0P6 


;fin du tracer 




1860 ; 








436C C9 


1870 
1880 ; 
1890 ; 


RET 


— routines 










1900 ; 








436D 3A4F44 


1910 TRACER: 


: LD 


A, (LARS) 


jnombre de ligne par colonne 


4370 47 


1920 


LD 


B,A 




4371 ED5B6444 


1930 
1940 ; 


LD 


DE,(X) 


jabscisse de depart 


4375 C5 


1950 LOQPT: 


PUSH BC 


;sauvegarde cospteur 


4376 D5 


1960 


PUSH DE 


jsauvegarde abscisse 


4377 3A6344 


1970 


LD 


ft, (INK! 




437A CD2CBC 


1980 


CALL INKCOD 




437D 2A5F44 


1990 


LD 


HL,(YGBAS) 




438C ED4B5D44 


20E10 


LD 


BC t (YGHAUT> 




4384 CD62BC 


2010 


CALL VERLIN 




4387 Dl 


2020 


POP 


DE 




4388 13 


2030 


IIC 


DE 


;avancer vers la droite 


4389 CI 


2040 


POP 


BC 




438A 10E9 


2050 


DJNZ LQOPT 





ROUTINES GRAPHIQUES DU SYSTEME i 95 



438C C9 2060 RET 
2070 ; 

20B0 ;Comparaison DE et BC 
2090 ;retour : Carry=l si DE<BC, si DE>=BC 
2100 ;tous registres gardes. 
2110 ; 



438D D5 


2128 C 


PDEBC: 


PUSH DE 




438E E5 


2130 




PUSH HL 




438F C5 


2140 




FQSH BC 


;pour travailler tranquil lenient 


4390 CB78 


2150 




BIT 7,B 


;BC positi-f ? 


4392 CAA343 


2160 

2170 ; 




JP 2, BCPOS 


;oui,traitement a part 




2180 ; 


BC est 


negatif. et DE ? 






2190 ; 








4395 B7 


2200 




OR A 


;carry=0 par defaut 


4396 CB7A 


2210 




BIT 7,D 


jDE positi-f ? 


4398 CAAE43 


2220 




JP Z.SUITE2 


;oui:dont DE>BC, carry=8 




2230 ; 


deux i 


Dflbres negatifs 




439B 62 


2240 




LD H,D 




439C 6B 


2250 




LD L,E 


;transfere DE dans HL 


439D B7 


2260 




OR A 


; carry a zero 


439E ED42 


2270 




SBC HL,BC 


;soustraction->carry ou non 


43A0 C3AE43 


2282 
2290 




JP SUITE2 






2308 ; 


BC est 


positH. Et DE ? 






2310 | 








43A3 37 


2320 BCPOS: 


SCF 


;carry=l par defaut 


43A4 CB7A 


2338 




BIT 7-D 


;DE negatif 7 


43A6 C2AE43 


2340 




JP NZ.SUITE2 


;oui, done DE<BC, carry=l 




2358 


deux nonbres positifs 




43A9 62 


2368 




LD H,D 




43AA 6B 


2378 




LD L,E 




43AB B7 


2380 




OR A 


;carry=0 


43AC ED42 


2390 
2400 




SBC HL,BC 


;Carry si DE<BC 


43AE CI 


2418 SUITE2 


: POP BC 




43AF El 


2420 




POP HL 




43B0 Dl 


2430 




POP DE 




43B1 C9 


2440 
2458 


i 


RET 






2460 


Multiplication de DE par 


A dans buffer TEMP01 




2470 


a 
I 






43B2 DD216644 


2488 ttJLTIP 


: LD IXJEMP01 




43B6 FD216944 


2490 




LD IY,TEHP02 




43BA C5 


2500 




PUSH BC 


jsauvegarde BC 


43BB 0608 


2518 




LD B,8 


jnoobre de bits dans A 


43BD DD360800 


2520 




LD (IX+W.0 




43C1 DD360100 


2530 




LD (IX+1J.0 




43C5 DD360200 


2540 




LD (IX+2),0 


iffise a zero du resultat 


43C9 FD7300 


2550 




LD (IY+0),E 




43CC FD7201 


2568 




LD (IY+1),D 




43CF FD360200 


2570 




LD (IY+2),0 


jresultat intersediaire 



96 i GRAPHEMES EN ASSEMBLEUR SUR AMSTRAD 



43D3 


CB2F 


2580 


SRA 


A 


43D5 


D2F543 


2590 PQ1DS: 


JP 


NC,5UIV 


43D8 


F5 


2600 


PUSH AF 


43D9 


FD7E00 


2610 


LD 


A, CIY+fl) 


43DC 


DD8600 


2620 


ADD 


A v (IX+0) 


43DF 


DD7700 


2630 


LD 


(IX+0),A 


43E2 


FD7E01 


2640 


LD 


A,(IYtl) 


43E5 


DD8E01 


2650 


ADC 


A, (IX+1) 


43E8 


DD7701 


2660 


LD 


(IX+1>,A 


43EB 


FD7E02 


2670 


LD 


A,(IY+2) 


43EE 


DD8E02 


2680 


ADC 


A,(IX*2) 


43F1 


DD7702 


2690 


LD 


(IX+2),A 


43F4 


Fl 


2700 
2710 j 


POP 


AF 


43F5 


FDCB0026 


2720 SUIV: 


SLA 


(IY+0) 


43F9 


FDCB0116 


2730 


RL 


UY+1) 


43FD 


FDCB0216 


2740 


RL 


(IY+2) 


4401 


CB2F 


2750 


SRA 


A 


44B3 


10D0 


2760 


DJNZ POIDS 


4405 


CI 


2770 


POP 


BC 


4496 


C9 


2780 
2790 ; 


RET 








2800 ^division du buffer TB 






2810 ; 






4407 


DD216644 


2820 D1V: 


LD 


IXJEHPQl 


440B 


010000 


2330 


LD 


BC,0 


44GE 


B7 


2840 
2850 ; 


OR 


A 


440F 


DD7E02 


2360 LOOP'S: 


LD 


A,(iX+2) 


4412 


B7 


2870 


OR 


A 


4413 


CA2F44 


2380 


JP 


Z,SUB16 






2890 ;soustr action 24 bits 


4416 


DD7E00 


2900 


LD 


ft,fIM) 


4419 


93 


2910 


SUB 


E 


441A 


DD7700 


2920 


LD 


(IX+0),A 


441D 


DD7E01 


2930 


LD 


A,<n+i) 


4420 


9A 


2940 


SBC 


M 


4421 


DD7701 


2950 


LD 


<IX+1),A 


4424 


DD7E02 


2960 


LD 


A,(IX+2) 


4427 


DE00 


2970 


SBC 


A,0 


4429 


DD7702 


2980 


LD 


(IX+2),A 


442C 


C33D44 


2990 
3000 ; 


JP 


TESTCA 


442F 


DD7E00 


3010 SUB16: 


LD 


A.UX+B) 


4432 


93 


3020 


SUB 


E 


4433 


DD7700 


3030 


LD 


(IX+0),A 


4436 


DD7E01 


3040 


LD 


A, (IX+1) 


4439 


9A 


3050 


SBC 


A,D 


443A 


DD7701 


3060 
3070 ; 


LD 


(IX+1),A 


443D 


D8 


3080 TESTtf 


a RET 


C 


443E 


03 


3090 


IfC 


BC 


443F 


C30F44 


3100 


JP 


LOOPS 



; premier decalage 
;pas d'addition intermediaire 
jsauvegarde nultiplicateur 
;addition du resultat interoediaire 



jrecupere nultiplicateur 
;decalage resultat intern. 



;bit suivant A 
;huit fois seulenent 
jrecupere BC 



par DE dans 



jmise a zero resultat 
jnise a zero carry 

;poids fort nombre 

jzero ? 

;oui t soustraction 16 bits normale 



jtest 5ur le carry pour -fin 



;f in du travail si Carry. 
;sinon une unite de plus 
;et continuer soustraction, 



ROUTINES GRAPHIQUES OU SYSTEME I 97 





3110 j 






3120 ;D£ devient sa valeur absolue 






3130 ; 




4442 CB7A 


3140 VALABS: BIT 7,D 


;DE negatif ? 


4444 C8 


3150 RET Z 


;non:pas de travail 


4445 F5 


3160 PUSH AF 


jsauvegarde A 


4446 7B 


3170 LD A,E 




4447 2F 


3180 CPL 




4448 5F 


3190 LD E,A 




4449 7A 


3200 LD A,D 




444A 2F 


3210 CPL 




444B 57 


3220 LD D,A 


; complement a un 


444C 13 


3230 INC DE 




444D Fl 


3240 POP AF 




444E C9 


3250 RET 
3260 ; 






3270 ; zone des variauieji 




3280 ; 




444F 00 


3290 LARG: DEFB 


;largeur des colonnes 


4450 00 


3300 NBVAL: DEFB 


jnombre de valeurs 


4451 0000 


3310 TABLG: DEFW 


jadresse du tableau 


4453 0000 


3320 MAX: DEFW 




4455 0000 


3330 MN: DEFW 




4457 8000 


3340 YGMIN: DEFW 




445? 0000 


3350 YGZERQ: DEFN 




445B 0000 


3360 YGMAX: DEFW 




445D 0000 


3370 Y6HAUT: DEFW 




445F 0000 


3380 YGBAS: DEFW 




4461 00 


3390 DPQS: DEFB 




4462 H 


3400 DNE6: DEFB 




4463 00 


3410 INK: DEFB 




4464 0000 


3420 X: DEFW 




4466 000000 


3430 TB1P01: DEFB 0,0,0 


; buffer de calcul 3 octets 


4469 000000 


3440 TEMP02: DEFB 0,0,0 


;idem 


Pass 2 errors: 


00 





L'execution debute avec le bloc des lignes 150 a 210. Ces instructions 
sont chargees de recuperer les parametres du CALL Basic, et de les placer 
dans les variables du programme. NBVAL est le nombre de valeurs a 
tracer, TABLO pointe sur la premiere de ces valeurs 16 bits, et LARG est la 
largeur de la colonne tracee, en nombre de points graphiques. Remarquez 
que NBVAL et LARG sont des valeurs 8 bits : seul leur poids faible est 
memorise. II est en effet inutile de memoriser le poids fort. II faudrait le 
faire s'il etait possible de placer plus de 255 valeurs & I'ecran ou de tracer 
des coionnes de plus de 255 points de large. En I'occurrence, ceia est 
inimaginable, car I'ecran fixe ne possede que 290 points de large, et deux 
points separent chaque colonne. 



98 l GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 

Puis, le programme proprement dit commence. Un appel 3 I'adresse 
$4215 (ligne 230 du programme), en langage machine, execute le trace en 
prenant pour donnees les valeurs des variables vues ci-dessus. On peut 
done parfaitement utiliser ce programme en langage machine. II suffit de 
placer les donnees dans les trois variables TABLO, NBVAL et LARG, puis 
d'effectuer un CALL $4215. 

Avant toute chose, il faut verifier que ('appelant a demande le trace d'un 
tableau a plusieurs valeurs. En effet, si NBVAL vaut ou 1, le trace est sans 
interet. Le RET C de la ligne 250 acheve I'execution si NBVAL<2. 

Ensuite a lieu la recherche des extremes. Ceux-ci sont stockes dans les 
variables MAX et MIN. On les initialise avec la premiere valeur du tableau, 
puis on boucle NBVAL-1 fois a partir de la seconde valeur pour reperer les 
valeurs extremes. 

L'instruction CALL CPDEBC est tres importante. Elle compare le contenu 
16 bits des registres DE et BC et positionne le flag Carry, en consequence : 
Carry^l si DE<BC, Carry=0 si DE> = BC. Ce serait facile a programmer s'il 
s'agissait de nombres de signe positif. En effet, dans ce cas, savoir si 
DE<BC revient a savoir si DE-BC<0. En soustrayant BC a DE, le Carry 
serait positionne comme voulu. 

Mais helas, les valeurs a comparer sont considerees comme des 
nombres signes. Cela signifie que les valeurs $0000 a $7FFF sont positives, 
et $8000 a $FFFF negatives. Un probleme risque de se poser dans le cas ou 
les nombres sont de signe oppose : il faudra done proceder autrement. 
Nous verrons la routine CPDEBC plus loin. 

Les extremes sont trouves simplement en comparant chaque valeur a 
MIN et MAX. Si la valeur est inferieure a MIN (en tenant compte du signe, 
e'est-a-dire que -18 est inferieur a -3), elle rempiace ce dernier. De meme, 
si une valeur est superieure a MAX, elle le rempiace. Et la boucle continue 
avec la valeur suivante, jusqu'a ce que toutes les valeurs aient ete 
examinees. La fin de la boucle est en ligne 540. 

Ensuite, le programme assigne et calcule les valeurs de YGMIN, YGMAX 
et YGZERO. II suit, pour ce faire, les calculs vus plus haut. Pour le calcul de 
YGZERO, il distingue les trois cas rencontres lors de I'etude : 

- si MIN>0, YGZERO=199; 

- si MAX<0, YGZERO=20 ; 

- sinon, YGZERO= (-MIN)/(MAX-MIN)*180+YGMIN. 

Le sous-programme VALABS utilise a ce sujet en ligne 760 a un role 
extremement important : il change DE en sa valeur absolue. Si DE est 
positif, rien n'estfait, sinon son signe est inverse par complementation & 2 
sur 16 bits. Nous detaillerons le fonctionnement de VALABS plus loin. 

Une fois arrives en ligne 910, nous devons initialiser quelques variables 
pour commencer le trace. II s'agit principalement d'optimiser un peu le 



ROUTINES GRAPHiOUES DU SYSTEME I 99 

trace des colonnes. MIN est remplace par sa valeur absolue, afin d'eviter un 
appel de VALABS lors de chaque boucle. En effet, le programme n'a 
desormais plus besoin de MIN mais de sa valeur absolue. On calcule 
egalement d'avance YGMAX-YGZERO et YGZERO-YGMIN. Leur utilisa- 
tion lors des traces en sera simplifiee, une soustraction etant supprimee. 

En ligne 1090 debute le trac£. L'encre de trace est mise a 1, et I'abscisse 
de depart est fixee a 50. Le trace des axes (lignes 1130 a 1240) utilise les 
routines syst£me HORLIN et VERLIN pour placer une ligne verticale de 
YGLIN a YGMAX a I'abscisse 50, et une ligne horizontale de 50 a 319 a 
I'ordonnee YGZERO. Une remarque est a formuler concernant ces routines 
HORLIN et VERLIN. Elles different de la routine DRAW par d'innombrables 
aspects. Non seulement leur utilisation demande un masque de couleur 
(d'ou le CALL INKCOD des lignes 1140 et 1200), mais de plus, elles 
travaillent avec des coordonnees differentes de DRAW, PLOT ou MOVE. Au 
lieu d'utiliser les points logiques (640 x 400 quel que soit le mode), HORLIN 
et VERLIN n'acceptent que les points physiques. Les abscisses vont done 
de a 159 en mode 0, deO a 319 en mode 1 et deO a 639 en mode 2. Quant 
aux ordonnees, elles vont de a 199. 

Cela complique la tache si le programme doit travailler dans n'importe 
quel mode, mais en revanche le trace des lignes par ces routines est 
beaucoup plus rapide qu'avec DRAW (en fait, DRAW les utilise pour tracer 
les petits segments constituant une droite). 

La boucle de trace des valeurs commence a la ligne 1280. Comme nous 
I'avons remarque lors de I'etude, il faut distinguer le cas des nombres 
negatifs et celui des nombres positifs. Le calcul de YG a lieu par les 
formules determinees. Les variables YGBAS et YGHAUT contiennent les 
ordonnees extremes de la colonne graphique a tracer. Le trace de cette 
derniere est effectue par le sous-programme TRACER. 

La fin de la boucle (lignes 1670 £ 1850) avance I'abscisse de trace, et 
modifie la couleur de trace. 

L'ensemble du programme ne pose done pas de probleme particulier, il 
est juste une application directe des formules de calcul et de I'algorithme 
determines prealablement II en est tout autrement des diverses routines 
restantes. Chacune d'elles necessite une etude approfondie. 



Les sous-programmes 



TRACER est la routine de trace d'une colonne. Son fonctionnement est 
relativement limpide. Connaissant les donnees X, YHAUT et YBAS, elle 
trace la colonne correspondante, de largeur LARG. La seule difficulty est 
due au fonctionnement de la routine systeme VERLIN. En effet, celle-ci 
demande !e masque du stylo de trace, et non son numero. Heureusement, 



100 I GRAPHtSMES EN ASSEVIBLEUR SUR AMSTRAD 

il existe une autre routine systeme qui peut se charger du calcul (CALL 
iNKCOD). II est egalement essentiel de sauver les registres utiles avant de 
tracer la colonne, car VERLIN les modifie tous. 

Nous arrivons maintenant a CPDEBC. Comme nous I'avons laisse 
entendre, la comparaison des registres DE et BC n'est pas simple, car il 
s'agit de nombres signes. La methode classique est d'utiliser une soustrac- 
tion. DE-BC doit nous donner Carry positionne si DE est inferieur a BC. 
Mais dans ce cas, $4000-$FOOO donnerait un Carry a 1. Pourtant, $4000 est 
positif et done superieur a $F0OO, qui lui est negatif. II s'agit de nombres 
signes. II faut done traiter differemment les cas ou DE et BC sont de signe 
contraire. Les deux cas ou DE et BC sont de meme signe peuvent se 
contenter de la soustraction simple. En effet, si ce sont deux nombres 
positifs, ils sont entre $0000 et $7FFF, et la soustraction donnera le Carry 
convenu. Si DE et BC sont negatifs egalement, car le nombre le plus grand 
de signe negatif est - 1 , represents par $FFFF, et ce dernier est aussi le plus 
grand 16 bits. La soustraction convient egalement. 

II reste les deux cas epineux ou Tun des deux registres est positif et le 
second negatif. En realite, ce n'est pas un probleme car un nombre positif 
est toujours plus grand qu'un negatif. Le tout est de savoir si DE contient le 
nombre positif ou le negatif. Si DE est positif, alors e'est lui le plus grand 
des deux, et on met le Carry a zero, sinon, on le met a un, car BC est le plus 
grand. 

Nous avons done un algorithme applicable : 

- si BC est negatif et DE aussi, faire DE-BC ; 

- si BC est negatif et DE non, CARRY=0 ; 

- si BC est positif et DE aussi, faire DE-BC ; 

- si BC est positif et DE non, CARRY=1. 

II est tres facile en Z-80 de savoir si un nombre signe est negatif ou non. 
Le Z-80 possede une instruction BIT qui permet de savoir si un bit d'un 
registre quelconque est a 1 ou a 0. Or, le signe du nombre contenu dans DE 
est indique par le bit 7 du registre D : 1 pour un nombre negatif, pour un 
positif. L'instruction "BIT 7,D" permet de savoir si DE est positif : si oui, le 
flag Z est mis b 1; un "JP NZ,add" sautera done a I'adresse indiquee si DE 
est negatif. On retient I'effet de l'instruction BIT par deux moyens. La 
definition est la suivante : BIT place, dans le flag Z, ['inverse du bit teste. Si 
le bit etait a 1, Z sera a 0. La deuxi^me fagon de memoriser cela est de 
penser "BIT teste si le bit est a 1". Dans cecas, "JP Z,add" est effectue si la 
reponse est oui. Par contre, "JP NZ,add" est effectue si e'est non. 

II est important d'assimiler le fonctionnement de BIT. Cette instruction 
est extremement puissante, mais la moindre inattention peut generer une 
erreur de logique (inversion des branchements & la suite du test). 



ROUTINES GRAPHIQUES DU SYSTEME I 101 

La routine CPDEBC travaille comme suit : 

BIT 7,B : on teste si BC est negatif ; 

JP Z,BCPOS : non, on va traiter ailieurs ce cas, sachant que 

BC est positif ; 
OR A : cette petite et anodine operation a pour simple 

but de positionner le Carry a ; 
BIT 7,D : cette fois-ci, on teste si DE est aussi negatif ; 

JP Z,FIN : non : done le Carry reste a zero, DE>BC. C'est 

fini ; 
soustrac. : puisque DE et VC sont positifs, on les soustrait 

simplement pour avoir directement le Carry ; 
BCPOS:SCF : cette instruction a I'effet inverse de OR A: elle 

met Carry a 1 ; 
BIT 7,D : DE est-il lui aussi positif? 

JP NZ,FIN : non : done DE<BC, done Carry reste a 1. C'est 

fini ; 
soustrac. : DE et BC sont tous les deux positifs, on les 

soustrait ; 
FIN: : fin de routine. 



Tout cela est bien entendu plus complique qu'une simple soustraction. 
Mais en dehors des particularites de certaines instructions (BIT, OR A, SCF), 
II n'y a aucune obscurite dans son deroulement. 

Nous devons aussi penser a la multiplication. Nous avons vu plus haut 
que la routine definie pour le trace de cercles ne convenait pas. II y a en 
effet un grand risque de tomber sur un Overflow. II faut ici multiplier un 
nombre 16 bits par un 8 bits. 

Le mecanisme de la multiplication peut en revanche etre recupere. Nous 
multiplions toujours par A qui possede huit bits. Mais le travail sur DE est 
different. En effet, alors que precedemment, seuls les 8 bits de droite de DE 
intervenaient, ici les 16 bits peuventetre significatifs. Un simple decalage a 
gauche nous ferait done perdre une information, et le resultat intermediate 
serait faux. L'addition finale egalement, bien sur. 

Pour ne pas perdre les 8 bits du registre D lors des huit decalages 
successifs. II faut utiliser un pseudo-registre 24 bits. Le Z-80 ne possede pas 
de tel registre, il faut le simuler. Pour cela, nous allons utiliser IY, Celui-ci va 
pointer sur une zone de 3 octets qui sera le fameux pseudo-registre. Notre 
choix se justifie par une remarque faite au chapitre 2. IY est un registre de 
pseudo-index : il permet d'assimiler n'irnporte quelle case memoire au 
registre A. Cela signifie qu'on peut effectuer sur une case memoire pointee 
par IY (ou IX) n'importe quelle operation, notamment rotation ou decalage. 

En ce qui concerne le resultat final, il faut noter que son format est lui 
aussi susceptible de grimper jusqu'a 24 bits. II faudra done egalement le 
placer dans un pseudo-registre qui sera pointe par IX. 



102 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 

Si Ton excepte ('utilisation du registre A pour les additions de resultats 
intermediates, la multiplication est alors strictement identique a notre 
precedente routine. Le decalage du resultat intermediate est, entre autres, 
un bon exemple. Void les deux sequences : 



Multiplication 16 Bits Multiplication 24 Bits 

SLA E SLA (IY+0) 

RL D RL (IY+1) 

RL (IY+2) 



II nous reste a realiser la division. Pas question ici de decalage. II s'agit de 
soustractions successives. Mais le probleme du format du resultat se pose 
encore : alors que nous divisons un nombre de 24 bits, le diviseur est de 
type 16 bits. 

La solution a ete effleuree plus haut : il faut proc6der en deux etapes. La 
premiere partie de la division va executer une soustraction 24 bits (le 
troisieme octet du diviseur etant assimile a un zero). Des que cela sera 
possible, la soustraction se fera ensuite sur 16 bits. Le Carry est en effet 
correctement positionne par la soustraction 16 bits. 

Le debut de la division est done le suivant : 

- si le dividende est 16 bits (troisieme octet=0), on soustrait directement le 
diviseur. On recommence jusqu'a ce que le Carry soit positionne, apres 
avoir ajout§ 1 au resultat. Cela intervient en effet lorsque la derniere 
soustraction a donne un resultat negatif (dividende inferieur au diviseur) ; 

- si parcontre le dividende est 24 bits, on soustrait le diviseur au dividende 
octet par octet, et eventuellement la retenue au troisieme de ces octets. 
Cela est effectue par la sequence suivante : 

LD A,(IX+0) : premier octet du dividende ; 

SUB E : soustraction simple du premier octet du diviseur. 

Cela positionne le Carry en cas de retenue ; 

mise a jour du premier octet du dividende. 

deuxieme octet. 

soustraction du deuxieme octet diviseur et de la 

retenue. 
LD (IX+1),A 

LD A,(IX+2) : dernier octet dividende. 
SBC A,0 : soustraction de la retenue uniquement. 



LD (IX+0),A 
LD A,(IX+1) 
SBC A,D 



LD (IX+2) f A 

Remarque : le resultat est remis & jour apres le test de fin, et non avant. 
En effet, on ne detecte la fin du travail que lorsque la soustraction produit 
un nombre negatif. Cette derniere operation est done en trop, il ne faut pas 
la comptabiliser. Pour cette raison, on sort de la routine de division. Sinon, 
on ajoute un au resultat et on recommence. 



ROUTINES GRAPHIQUES DU SYST&ME I 103 

Enfin, la derniere routine est celle qui transforme un nombre negatif en 
sa valeur absolue. Pour cela, il ne suffit pas d'inverser le bit de signe. II 
s'agit du format "nombre signe". On obtient le nombre de signe oppose de 
la fagon suivante : 

- inverser les 16 bits du nombre, y compris celui de signe ; 

- ajouter 1. 

■ 
Remarquez qu'on obtient par cette operation (qui porte le joli nom de 
complementation a deux) I'oppose d'un nombre, meme si celui-ci est 
positif. -12 deviendra 12, mais 365 deviendra -365 (voir annexe 7). 

Notre routine calcule la valeur absolue. II ne taut done pas proceder & la 
complementation si le nombre est d6j& positif : nous obtiendrions un 
resultat negatif ! 

Pour complementer k deux le registre DE, il nous faut I'instruction CPL 
Cette derniere inverse les bits du registre A. La complementation passe 
done par la sequence suivante : 

LD A,E : premier octet de DE 

CPL : inversion de tous les bits 

LD E,A : et remise a jour de E 

LD A,D : meme travail sur le second octet de DE 

CPL : inversion des huit bits 

LD D,A : DE est maintenant inverse 

INC DE : et on ajoute 1 pour avoir le complement a deux I 



Conclusion 

Le programme 3.5 en langage Basic correspond a nos travaux. 



10 ' ******************** 

20 '** Programme 3-5 ** 

30 ' ******************** 

40 ' 

50 'Trace d 'histograrnmes en langage machine 

60 ' 

70 MEMORY &3FFF 

80 DEFINT a-z 

90 ad=&4200: lign=200 

100 ctrl=0sREAD c$: IF c$="-fin" THEN 550 

110 FOR i=l TO LEN(c$) STEP 2 

120 c=VAL< ,, &"+MID$<c:r,i ,2) ) 

130 POKE ad, c:ad=ad+l: Ctrl =ctrl+c 

140 NEXT:READ teste: IF testeOctrl THEN PRINT'Er 

reur DATA ligne"l ign: END 
150 lign=lign+10:BOTO 100 
1&0 * 



104 I GRAPHEMES EN ASSEMBLEUR SUR AMSTRAD 



170 
180 

190 

200 

210 

220 

230 

240 

250 

260 

270 

280 

290 

300 

310 

320 

330 

340 

350 

360 

370 

380 

390 

400 

410 

420 

430 

440 

450 

460 

470 

480 

490 

500 

510 

520 

530 

540 

550 

560 

570 

580 

590 

600 

610 

620 

630 

640 

650 

660 



DATA 

DATA 

DATA 

DATA 

DATA 

DATA 

DATA 

DATA 

DATA 

DATA 

DATA 

DATA 

DATA 

DATA 

DATA 

DATA 

DATA 

DATA 

DATA 

DATA 

DATA 

DATA 

DATA 

DATA 

DATA 

DATA 

DATA 

DATA 

DATA 

DATA 

DATA 

DATA 

DATA 

DATA 

DATA 

DATA 

DATA 

DATA 



DD7E00324F44DD7E02325044DD6E04DD 
6605225 1 443A5044FE02D82 A5 1 444E23 



46ED435: 



;44ED435544233 



D4E234623ED 



5B5344CD8D43D24042ED435344C34E42 
ED5B5544CD8D43DA4E42ED4355443DC2 
2B422 1 1 4002257442 1 C700225B442A55 
44CB7CC26F422 1 1 400225944C3 A 1 422A 
5344CB7CC A80422 1 C700225944C3A 1 42 
ED5B5544CD42443EB4CDB2432A5344ED 
5B5544B7ED52EBCD074421 1400092259 
44ED5B5544CD4244ED5355442A5B44ED 
4B5944B7ED427D3261442A5944ED4B57 
44B7ED427D3262443E01326344213200 
2264443E0 1 CD2CBC 1 1 32002A5744ED4B 
5B44CD62BC3E0 1 CD2CBC 1 1 32000 1 3F0 1 
2A5944CD5FBC3A504447C52A51445E23 
5623225 1 44CB7AC227433A6 1 44CDB243 
ED5B5344CD07442A594409225D442A59 



44 



O'-M 



F44C34643CD42443A6244CDB243 



ED5B5544CD07442A5944B7ED42225F44 
2A5944225D44CD6D432A64443A4F444F 
06000923232264443A63443C326344FE 
04DA69433E0 1 326344C 1 1 0BEC93A4F44 
47ED5B6444C5D53A6344CD2CBC2A5F44 
ED4B5D44CD62BCD1 13C1 10E9C9D5E5C5 
CB7SCAA343B7CB7ACAAE43626BB7ED42 
C3 AE4337CB7 AC2AE43626BB7ED42C 1 E 1 
D 1 C9DD2 1 6644FD2 1 6944C50608DD3600 
00DD360 1 00DD360200FD7300FD720 1 FD 
360200CB2FD2F543F5FD7E00DD8600DD 
7700FD7E0 1 DD8E0 1 DD7701 FD7E02DDSE 
02DD7702F 1 FDCB0026FDCB0 1 1 6FDCB02 
16CB2F10D0C1C9DD216644010000B7DD 
7E02B7CA2F44DD7E0093DD7700DD7E01 
9ADD770 1 DD7E02DE00DD7702C33D44DD 
7E0093DD7700DD7E0 1 9ADD770 1 D803C3 
0F44CB7AC8F57B2F5F7A2F5713F1C900 
"fin" ,0 

CLEAR: DEFINT a-z : MODE 1: WINDOW #0,1,15 

INK 0,0s INK 1,15: INK 2,20: INK 3,26 

DIM tablo<40) 

PRINT "SAISIE" 

i=l:tablo(0)=l 

WHILE tablo(i-i><>0 AND i<40 
PRINT "Valeur";i; 
INPUT tablo(i) :i=i+l 

WEND: MODE 1 

1 arg= (320-50) /(i-2) -2 

CALL &420B , etabl o ( 1 ) , i -2 , 1 ar g 

GOTO 580 



1647 

1272 

1533 

1789 

1968 

903 

1474 

1719 

1942 

1446 

1799 

1656 

1258 

1278 

1282 

1481 

1602 

1293 

1610 

1643 

1269 

1043 

1431 

1344 

2474 

2397 

2360 

1779 

1542 

2028 

1948 

2016 

1719 

1810 

1953 

1870 

1835 



■ it 



ROUTINES GRAPHIQUES DU SYSTEME I 105 

Notre programme de traces d'histogrammes est sensiblement plus 
rapide que son equivalent Basic, et il est surtout beaucoup plus maniable. 
En effet, il peut travailler sur n'importe quel ensemble de valeurs. Sa plus 
grande particularity est son deroulement simple : quelques calculs pr^limi- 
naires et une boucle unique pour tracer les valeurs. La difficulty ne reside 
que dans les routines de calcul. La moralite de I'histoire doit paraitre 
evidente. En effet, bien que le programme ait un but uniquement graphi- 
que, les problemes lies au graphisme sont passes quasiment inapergus. 
Cet aspect paradoxal doit mettre en evidence I'avantage des routines 
systeme de I'Amstrad. En effet, le systeme de coordonnees retenu pour les 
routines VERLIN et HORLIN nous a facilite la tache a un point tel que le 
trace des colonnes proprement dit est devenu un jeu d'enfant. S'il avait 
fallu adresser directement chaque case memoire de I'ecran pour tracer les 
colonnes, le programme aurait incontestablement ete plus complique. 



REMPLISSAGE DE ZONES 



Introduction 



Puisque vous avez constate la facilite de programmation apportee par les, 
nombreuses routines graphiques de I'Amstrad, vous etes pret pour une 
derniere mise en ceuvre de celles-ci. 

Jusqu'a present, les programmes realises ne mettaient en ceuvre que 
peu d'appels de routines systeme. Ceux-ci etaient le plus souvent restreints 
a un usage bien precis, et generalement unique, au niveau du travail 
effectue. Dans le trace de cercles, les routines PLOT et DRAW tragaient 
uniquement le contour du cercle, les calculs ne les utilisant pas. II en allait 
de meme pour le trace d'histogrammes. 

La routine de rempiissage de contours que nous allons realiser sera 
extremement differente. En effet, les routines graphiques vont y jouer un 
role essentiel, tandis que la partie calcul sera d'une grande simplicite. Nous 
nous proposons de realiser une routine remplissant avec une certaine 
couleur n'importe quelle figure fermee placee sur I'ecran, connaissant un 
point situe en son enceinte. 

Les possesseurs des modeles 664 et 6128 savent sans doute qu'une 
instruction de ce type est integree a leur interpreteur Basic. Mais cette 
instruction remplit les figures dont le contour est d'une couleur uniforme. 
La routine que nous allons realiser, au contraire, acceptera comme bordure 
de figure n'importe quelle couleur. Le fonctionnement des deux routines 
est en fait identique, seuls changent les tests determinant si un point 
appartient au bord de la figure ou non. Mais aucun Amstrad ne fournit, a ce 
jour, d'instruction remplissant une figure de contour multicolore. Nous 
allons pallier ce manque. 



106 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 

Methodes de remplissage 

II existe deux fagons de traiter le probleme. La premiere conduit a une 
routine extremement simple. II faut toutefois fixer une contrainte : les 
figures devront etre egalement simples, concaves (bien que le terme ne 
soit pas tout a fait exact d'un point de vue mathematique). Un cercle est par 
exemple une figure convenant a ce point de vue. L'algorithme de 
remplissage a partir d'un point situ6 a rint6rieur est alors le suivant : 

- se deplacer sur le premier point du bord gauche, sur la ligne actuelle ; 

- tracer jusqu'au premier point de la bordure de droite en remplissant les 
points du fond rencontres ; 

- grimper d'une ligne ; 

- recommencer jusqu'a ce qu'aucun espace ne se trouve entre le point de 
gauche et celui de droite. 

Et on recommence la meme demarche vers le bas lorsque la partie 
superieure de la figure est ainsi remplie (c'est-a-dire ceile situee au-dessus 
du point de depart). 

Malheureusement, si cette procedure procure le double avantage de la 
simplicity et la rapidite, elle donne un remplissage tout a fait incorrect si la 
figure est plus complexe. Le schema 3.13 represente une figure quelcon- 
que (a laquelle nous ferons reference dans la suite de notre etude) et son 
remplissage par notre methode simplifiee, a partir du point marque d'une 
croix. 




Point de depart 



Schema 3.13 



Figure complexe exemple mal remplie. 



ROUTINES GRAPHIQUES DU SYSTtME I 107 

Vous constatez qu'une grande partie de la figure est restee inexploree. 
Vous trouverez pourquoi en suivant la logique du raisonnement a partir de 
ce point de depart. Lorsque le programme part du point gauche et remplit 
la figure jusqu'au premier point de bordure rencontre, il ignore si ce point 
de droite est reellement la bordure de la figure. D'ou I'absence de 
remplissage de ia zone qui se trouve eventuellement derriere. 

La figure 3.14 represente le meme processus applique a la meme figure, 
mais a partir d'un point de depart different. 





















® 


X 






© 


























^r 














® 



























Schema 3.14 



Autre remplissage incorrect 



Le probl£me n'est pas moindre, bien au contraire. Toutefois, si ia figure 
est connue du programme, il est bien entendu possible d'appeler plusieurs 
fois la routine en stipulant les differents points d'origine permettant un 
remplissage complet. Ce sera le cas sur le schema 3.14 si Ton remplit 
ensuite a partir des points 1,2 et 3, 

En remarquant cela, nous venons de trouver le principe du remplissage 
veritable : puisque I'algorithme de base ne peut pas s'occuper des zones 
invisibles, il suffit de le modifier afin qu'il repere les points de depart 
supplementaires. De cette fagon, nous pourrons repartir automatiquement 
de ces points pour continuer le remplissage des zones laissees de cote. 



Le reperage des points de depart supplementaires est un probleme 
interessant. Pour le resoudre, il faut en effet examiner tous les cas de figure 
possibles. L'algorithme de base, nous I'avons vu, procede de la meme 
fagon pour le remplissage vers le haut de la figure et vers le bas de celle-ci. 



108 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 

En ce qui concerne le sens vertical de emplacement, les tests de recherche 
des points a probleme seront exactement les memes quel que soit ce sens. 

II nous suffira simplement d'inverser ia progression de la routine sur I'axe 
des ordonnees. 

En revanche, nous avons un algorithme qui part toujours du point de 
gauche pour aller vers la droite. II faut done reperer les problemes entre ces 
deux points extremes. 

Supposons que nous progressons vers le haut sur le schema 3.15 : les 
deux points extremes trouves provoqueront un remplissage incorrect, la 
zone problematique se situant au-dela. 



Point & memoriser 




Point de gauche 



Point de droite 



Schema 3.15 



Comment reperer un point special. 



Par contre, nous pouvons reperer le probleme lors du remplissage de la 
ligne precedente. En effet, si, parallelement a celui-ci, nous surveillons la 
ligne du dessus, on va voir defiler dans I'ordre trois points couleur de fond, 
un point de bordure, et quatre points de fond. Or, nous savons alors 
pertinemment que le point de bordure situe dans cette liste va poser un 
probleme, puisque les points suivants ne seront pas examines. II nous 
suffit done de memoriser, pour traitement ulterieur, le premier point de 
fond suivant ce point de bordure. II sera le point de depart pour un nouvel 
appel de la routine. Ce point est marque d'un triangle sur le schema. 

Ce que nous venons de remarquer pour un deplacement vers la droite 
est egalement valable lorsque nous recherchons le point le plus a gauche. 



ROUTINES GRAPHIOUES DU SYST£ME I 109 

A propos des extremes, un autre probleme peut se poser, illustre par la 
figure 3.16. 










' '■'.'.■::■:■:■'. 



a 



Schema 3.16 



Un autre type de point special. 



Comment trouver le point gauche extreme (et le droit) lorsque I'on 
grimpe d'une ligne ? La solution est de partir du point precedent. On 
grimpe exactement a la verticale. Si le point rencontre est de la couleur du 
fond, alors cela signifie que la bordure s'est decalee a gauche, et dans ce 
cas nous poussons notre point dans ce sens jusqu'a toucher la bordure. II 
faut bien sur proceder identiquement pour le point de droite. 

Mais la figure met en evidence le probleme : le point D, nouvel extreme 
de droite, nous cache une zone non exploree. II nous faut done, lorsque 
nous deplagons les points extremes avant de remplir la ligne, reperer 
comme precedemment les points de depart supplementaires (le point sur 
la figure). II y a done trois possibilites de decouvrir des points a probleme : 
ou bien a gauche et a droite sur la ligne precedente, ou bien a droite sur la 
ligne actuelle. 

Cela dit, nous avons vu que la routine travaillait identiquement quel que 
soit le sens d'exploration vertical. Or, pour les points a probleme, nous 
connaissons le sens qu'il faudra utiliser pour remplir la zone ignoree. Par 
exemple, dans notre derniere figure (3.16), il faut prendre le sens inverse 
(vers le bas). Le remplissage vers le haut sera inutile puisque deja effectue. 
II ne faudra done pas uniquement memoriser le point de depart, mais aussi 
le sens de travail pour la routine lorsqu'elle demarrera le processus a partir 
de celui-ci. 



110 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 

Algorithme de remplissage 

Notre algorithme va se decomposer en plusieurs appels successifs d'une 
meme routine. Celle-ci se chargera du remplissage simple d'une zone, a 
partir d'un point donne, et dans un seul sens vertical de progression. 
S'agissant du remplissage simple de notre figure de depart, il faudra done 
appeler la routine une fois pour le haut de la figure, et une autre pour le 
bas. Ensuite, le cas 6cheant, nous recommencerons avec les eventuels 
points speciaux reperes, dans le sens qui sera alors precise. 

La consistance de la routine de remplissage unidirectionneiie est 
conforme a I'etude precedente : 

- a partir du precedent point de gauche (ligne en dessous) trouver le point 
situe le plus £ gauche, cela en controlant que la ligne du dessous est 
conforme, et ne comporte pas de point special. Si un tel point est repere, le 
m6moriser avec un sens de recherche inverse a celui actuellernent utilise 
(vers le bas si I'on progresse vers le haut) ; 

- proc^der a la meme operation vers la droite, toujours en reperant un 
eventuel point particulier, memorisation identique des points speciaux 
(sens inverse de recherche) ; 

- remplir la ligne entre ces deux points extremes, tout en scrutant la ligne 
situee au-dessus pour reperer les autres points speciaux. Si un tel point est 
trouve, le memoriser avec un sens de recherche identique ; 

- passer a la ligne au-dessus ; 

- recommencer tant que le point de gauche est different de celui de droite. 
Le programme 3.6 en Basic est une mise en ceuvre de ce procede. 



10 ******************** 

20 ' ** programme 3.6 ** 

30 ' ******************* 

40 * 

50 'Programme de remplissage de zones en Basic 

60 'Frogrammation volontairement proche du LM 

70 ' pour transposition facile. 

80 ' 

90 RANDOMIZE TIME/300: ' i nitialise generateur ale 

atoire 
100 DEFINT a— z : 'toutes variables de type entier 

16 bits 
110 DIM xd(320) ,xg(320) ,y<320) ,d(320) : ' pile sim 

ulee 
120 MODE 1 
130 WINDOW #0,1,10,1,25 



ROUTINES GRAPHIQUES DU SYST^ME I 111 

140 FOR i=l TO 20: 'on trace 20 lignes 
150 MOVE 640*RND,400*RND: 'au hasard 
160 DRAW 640*RND,400*RND,1+INT<RND*3) : 'couleur 

au hasard 
170 NEXT 

180 PLOT 0,0: 'on trace un cadre 
190 DRAW 639,0: 'pour eviter tests 
200 DRAW 639,399 
210 DRAW 0,399 
220 DRAW 0,0 
230 PLOT 800,800, 1 : 'positionne le stylo graphiqu 

e 
240 MOVE 320,200: 'point de depart 
250 c=l: 'stylo de remplissage 
260 GOSUB 360: 'remplissage 
270 END 
280 '=====—==================================== 



290 * 

300 ' sous-programme de rempl i ssage 

310 ' 

320 ' ======^--====================== 



330 ' 

340 'Initialisation de la -fausse pile 

350 ' 

360 x=XP0S: 'recupere X-depart 

370 y=YPOSs 'recupere Y-depart 

380 WHILE TE5TR<-2,0)=0: 'on se deplace a gauche 

jusq'au bord 
390 WEND 

400 xg=XP0S+2: 'xg=point de gauche=bordure+l 
410 MOVE x,y: replace au milieu figure 
420 WHILE TESTR(2,0)=0: 'on se deplace a droits j 

usqu'au bord 
430 WEND 

442) xd=XP0S-2: 'xd=point de draite=bordure-l 
450 sp=2: '-faut pointeur pile: deux points a etud 

ier 
460 xg(l)=xg: premier point pour demi— figure du 

haut 
470 xd(i)=xd: 'xg et xd=ceux trouves ci-dessus 
480 y(i)=y+2: 'Y=ligne au dessus 
490 d CI )=2: 'di recti on=vers le haut 
500 xg (2) =xg: ' second point pour demi— figure du b 

as 
510 xd(2)=>d:'xg et xd=ceux trouves ci-dessus 

520 y (2)=y: 'Y=ligne de depart 

530 d C2) =-2: 'direction=vers le bas 

540 ' 



112 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 

550 'an vide la -fausse pile paint par point 
568 ' 

570 WHILE spOOa 'tant qu'il y a des points a voi 

r 

580 xg=xg(sp) : 'recuperer xg de depart 

590 xd=xd (sp) : 'recuperer xd de depart 

600 y=y(sp): ' recuperer y de depart 

610 s=d<sp): 'recuperer direction de recherche 

620 sp=sp-l : 'diminuer la pile de ce paint 

630 ' 

640 travail sur un point donne XG,XD,Y,S 

650 ' 

660 MOVE xg,y: 'se placer a gauche 

670 IF TESTR<0,0>=0 THEN 790: 'le point est dans 

la -f i gure : depl acer 
680 ' 

690 'le point xg n'est pas sur la bordure: on le 

pousse a gauche 
700 ' 

710 WHILE TESTR<2,0)<>0: 'le point est sur bord: 

deplacer a droite 
720 WEND 

730 xg=XPOS: 'c 'est le nouveau XG de cette ligne 
740 GOTO 980: 'suite du traitement 
750 * 
760 'le point xg est sur la bordure :on le pouss 

e a droite 
770 'en verifiant qu'il n *y a pas de point speci 

al en dessous 
780 ' 

790 -f=0: 'pas de point special repere 
300 WHILE TESTR<-2,0)=0: 'on va vers la gauche 
S10 IF TESTR(0,-s)<>0 THEN 350: 'le point en dess 

ous est de la bordure, ok. 
820 -f=ls 'c'est un point special, il n'est pas* sur 

bordure 
S30 x2=XP0S: 'retenir cette position d'abscisse 
340 y2=YP0S: 'et 1'ordonnee 

350 MOVER 0,s: 'remonter a la ligne actuelle 
860 WEND 
870 ' 
880 xg=XP0S+2: 'c'est le nouvel xg, a droite de 1 

a bordure 
390 IF -F=0 THEN 980: 'il n'y avait pas de point s 

pecial , ok- 
900 sp=sp+l: 'retenir le point detecte 
910 xg <sp)=x2-2: 'xg de depart 
920 xd(sp)=x2: 'xd de depart 
930 y(sp>=y2:'Y de depart 
940 d(sp)=-s: 'direction de recherche=inverse 



ROUTINES GRAPHIQUES DU SYSTtME I 113 

950 ' 

960 'on a fini avec xg, meme travail maintenant 

pour xd mais inverse. 
970 ' 

980 MOVE xd,y:'se placer a droite sur la ligne 
990 IF TESTR<0,0)=0 THEN 1110= 'point dans le vid 

e, pousser a droite 
1000 ' 
1010 'le point xd est sur la bordure, on le pous 

se a gauche 
1020 ' 
1030 WHILE TESTR<-2,0)<>0: 'on pousse le point a 

gauche de la bordure 
1040 WEND 
1050 xd=XPQS: 'nouvel xd=a gauche de bordure droi 

te 
1060 GOTO 1310: 'suite du traitement narmale 
1070 ' 
1080 'le point xd n'est pas sur la bordure, on 1 

e pousse a droite 
1090 'en verifiant la presence de points speciau 

x en dessous 
1100 ' 

1110 -f=0: 'pas de point special repere 
1120 WHILE TESTR(2,0)=0: 'on va vers la droite 
1130 IF TESTR<0,-s)<>0 THEN 1170: 'le point en de 

ssous est normal 
1140 -f = l:'ce point est special, le memoriser 
1150 x2=XP0S: 'xg de depart 
1160 y2=YPOS: 'Y de depart 

1170 MOVER 0,s: remonter a la ligne actuelle 
1180 WEND: 'cantinuer de pousser a droite 
1190 ' 
1200 xd=XP0S-2: 'nouvel xd=a gauche de bordure dr 

oite 
1210 IF f=0 THEN 1310: 'pas de point special vu, 

ok. 
1220 sp=sp+l: 'retenir ce point 
1230 xg(sp)=x2: 'xg de depart 
1240 xd(sp)=x2+2: 'xd de depart 
1250 y(sp)=y2:'Y de depart 

1260 d(sp)=-s: 'direction de recherche=inverse 
1270 ' 
1280 'fin du travail sur xg et xd, maintenant co 

mmence le rempl issage 
1290 'elementaire de la ligne. 
1300 * 

1310 IF xg>xd THEN 1700:'c'est la fin du travail 
1320 ' 



114 I GRAPHEMES EN ASSEMBLEUR SUR AMSTRAD 






1330 MOVE xg,y: 'se placer a gauche au bard 

1340 WHILE TESTR<2,0>=0: 'examiner vers la droite 

1350 WEND 

1360 ' 

1370 'on est alle Jusqu'a la bordure visible. II 

■faut veri-fier qu'elle 
1380 'correspond a celle trouvee a partir de la 

1 igne precedente 
1390 ' 
1400 IF XPOS<xd THEN 1480: 'le bard trouve n'est 

pas le vrai :point special 
1410 MOVER -2,0 

1420 DRAW xg,y : 'remplissage sans probleme 
1430 GOTO 1680: 'et suite de la progression 
1440 ' 
1450 'on a trouve un espace entre les deux xd su 

pposes. Mais peut-etre est— il 
1460 'du a un bout de bordure horizontal *? 
1470 * 

1480 xs=XPOS: 'sauvegarde du XD trouve 
1490 MOVER -2,0 
1500 DRAW xg,y: 'rempl i ssage 

1510 MOVE xs,y: 'revenir a droite au bord trouve 
1520 WHILE TESTR(2,0)<>0: 'sauter la bordure 
1530 WEND 
1540 IF XPOS>=xd THEN 1680:'c'est bon, la bordur 

e etait horizontale 
1550 ' 
1560 'il y a un espace entre la fin de la bardur 

e horizontale et la vraie 
1570 'bordure, done e'est une zone a traiter plu 

s tard. 
1580 ' 

1590 sp=sp+l: 'il y a une zone a memoriser 
1600 xg <sp)=XPQS: 'xg de depart=a droite bordure 

horizontale 
1610 xd(sp)=xd: 'xd de depart=celui calcule d'apr 

es ligne prec- 
1620 y(sp)=y:'y de depart=actuel 
1630 d (sp)=s: 'direction de recherche=la meme 
1640 xd=xs— 2: 'recadrer xd pour suite du travail 
1650 ' 

1660 '-fin du travail sur la ligne actuelle 
1670 ' 

1680 y=y+s: 'progression verticale de recherche 
1690 GOTO 660: 'et suite du travail sur nouvelle 

ligne 
1700 WEND: '-finir de vider la pile 
1710 RETURN: 'fin du remplissage 



ROUTINES GRAPHIQUES DU SYSltME I 115 

II faut noter la partie initialisation de la routine. Elle recupere le point de 
depart, determine les points gauche et droit de la ligne de depart, et place 
les points de depart des deux demi-zones initiales. On utilise a cet effet une 
fausse pile et un faux pointeur de pile SP. La pile est simulee par quatre 
tableaux XG,XD, Y et S. S est la direction de recherche : elle est -2 pour 
allervers le hautet +2 vers le bas. Remarquez egalement les procedures de 
recherche des points extremes. Elles sont assoctees d la recherche des 
points speciaux. 

Le programme 3.6 est en Basic simplifie. Les instructions ont ete 
rapprochees le plus possible du langage machine afin de simplifier la 
transposition. Le programme 3.7 qui suit est done une simple traduction de 
ce programme. 







10 ; 












20 jProgramme de rempiissage de 


zone 






30 jprogramme 3.7, transposition 


Lfl du prog 3.6 






40 ; 








BBC6 




50 GPOS: 


EQU 


8BBC6 




BBC0 




60 MOVE: 


EQU 


tBBC0 




BBF6 




70 ORAM: 


EQU 


8BBF6 




BBF3 




80 TESTR: 


EQU 


SBBF3 




BBC3 




90 MOVER: 
100 ; 


EQU 


#BBC3 




5008 




110 

120 ; 


ORB 


#5000 








130 ; initialisations di'verses 








140 ; 








5000 


FD210S53 


150 


LD 


IY.STftCK 




5004 


FD360002 


160 


LD 


(IY),2 




5003 


21FF3F 


170 


LD 


HL,#3FF 




500B 


222253 


180 


LD 


(PILE) ,HL 




500E 


DD210A53 


190 


LD 


IX.COUL 


jpointe sur couleur 


5012 


2A0C53 


200 


LD 


HL,(M0DE) 


; emplacement ;■; mode 


5015 


7D 


210 


LD 


A,L 




5016 


2F 


220 


CPL 






5017 


6F 


230 


LD 


L,A 




5018 


7C 


240 


LD 


A,H 




5019 


2F 


250 


CPL 






501A 


67 


260 


LD 


H,A 




501B 


23 


270 


INC 


HL 




501C 


220E53 


280 
290 ; 


LD 


(NMODE) ,HL 


j-fin calcul -mode 


501F 


CDC6BB 


303 


CALL GPOS 


; recupere xpos et ypos 


5022 


ED531B53 


310 


LD 


(X),DE 




5026 


221253 


320 
330 ; 


LD 


(Y),HL 


jstockage pour travaux 


5029 


ED5B0E53 


340 L1020: 


LD 


DE, (NMODE) 


ideplaceaent vers qauc 



116 I GRAPHEMES EN ASSEMBLEUR SUR AMSTRAD 



502D 210000 


350 


LD HL,0 




5050 CDF3BB 


360 


CALLTESTR 




51933 B7 


370 


OR A 


;vide ? 


5034 CA2950 


380 
390 ; 


JP Z.L1020 


;oui : continuer vers gauche 


5037 CDC6BB 


400 


CALLGPQS 




503A 2A0C53 


410 


LD HL, (MODE) 




503D 19 


420 


ADD HL,DE 




583E 221453 


430 


LD UG),H 


;calcul fini pour xg lere 
ligne 


5041 ED5B1053 


440 


LD DE,(X> 




5045 2A3253 


450 


LD H-,(Y) 




5848 CDC0BB 


460 
470 ; 


CALL ROVE 


jmove x,y 


5040 ED5B0C53 


480 L1060: 


LD DE,(MODE) 




504F 2100M 


490 


LD HL,3 




5052 CDF3BB 


500 


CALL TESTR 




5855 B7 


510 


QR A 


;vide ? 


5856 CA4B58 


520 
530 ; 


JP Z,L1060 




5059 CDC6BB 


540 


CALL GPOS 




505C 2A0E53 


550 


LD HL,(NHQDE) 




505F 19 


560 


ADD HL,DE 




5060 19 


570 


ADD HL,DE 




5061 ED531653 


580 
590 ; 


LD (XD),DE 


;f in calcul xd lere Ligne 




600 jempil 


age lere deoi-zane (haut) 






610 ; 






5065 2A1053 


620 


LD HL,(XJ 




5068 ED5B0E53 


630 


LD DE,£NJ1QDE) 




506C 19 


640 


ADD H,DE 




586D EB 


650 


EX DE,HL 




5B6E 2A2253 


660 


LD HL f (PIL£) 




5071 CDl-th2 


670 


CALL PUSHDE 




5074 ED5B1053 


680 


LD DE,(X) 




5078 CDFE52 


690 


CALL PUSHDE 




507B ED5B1253 


700 


LD DE,(Y) 




507F 13 


710 


INC DE 




5080 13 


720 


IMC DE 




5081 CDFE52 


730 


CALL PUSHDE 




5084 110200 


740 


U> DE,2 




5887 CDFE52 


750 
760 j 


CALL PUSHDE 




• 


770 ;efupilage 2eme demi-zone (bas) 






730 ; 






508A ED5B1453 


790 


LD DE,(XG) 




508E CDFE52 


800 


CALL PUSHDE 




5091 ED5B1653 


810 


LD DE,(XD) 




5095 CDFE52 


820 


CALL PUSHDE 





ROUTINES GRAPHIQUES DU SYST£ME I 117 



5098 ED5B1253 


850 


LD DE,(Y) 


a59C CDFE52 


840 


CALLPUSHDE 


509F 11FEFF 


850 


U) DM 


50A2 CDFE52 


860 


CALL PUSHDE 


50A5 222253 


870 
880 ; 


LD (PILE) ,HL 




890 ;DEBUT BOUGIE PRINC1PALE DE SAJT AU TRAITEttENT 




900 ; 




50A8 3A0853 


910 GLOOP: 


LD A, (STACK) 


50AB B7 


938 


OR A ;pil fi v ide ? 


50AC C3 


930 


RET Z ;fini ! 



940 ; 

950 ;PR0GRAWE DE TRAVAIL. Retourne en GLQOP si fini (pas de RET, 

960 ;la nouvelle pile est uniquement utilisee pour passer 

970 ;les paranetres (zones a remplir) 



MAD 


2A2253 


990 


LD HL,(PILE) 




50B0 


CD0353 


1000 


CALL POPDE 




50B3 


ED531853 


1010 


LD (DELY) ,DE 




50B7 


7B 


1020 


LD A,E 




50B8 


2F 


1030 


CPL 




50B9 


5F 


1040 


LD E,A 




50BA 


7A 


1050 


LD A,D 




58BB 


2F 


1060 


CPL 




50BC 


57 


1070 


LD D,A 




50BD 


13 


1080 


INC DE 




50BE 


ED531A53 


1090 


LD (HDELY) ,DE 




50C2 


CD0353 


1100 


CfiLL POPDE 




50C5 


ED531253 


1110 


LD (Y) ,DE 




50C9 


CD0353 


1120 


CALL POPDE 




50CC 


ED531653 


1130 


LD (XD),DE 




50D0 


CD0353 


1140 


CALL POPDE 




50D3 


ED531453 


1150 


LD UG),DE 




50D7 


222253 


1160 


LD (PILE).HL 




50DA 


3A0853 


1170 


LD A, (STACK) 




50DD 


3D 


1180 


DEC A 


;raj compteur pile 


50DE 


320853 


1190 


LD (STACK) ,A 




i 




1200 ; 










1210 jtraitefflent d'une ligne de la 


zone 






1220 i 






50E1 


ED5B1453 


1230 NEULIN 


; U DE,(XG) 




50E5 


2A1253 


1240 


LD HL f (Y) 




50E8 


CDC0BB 


1250 


CALL MOVE 


;niQve xg,y 






1260 ; 






50EB 


110000 


1270 


LD DE,0 




50EE 


210000 


1280 


LD HL,0 




50F1 


CDF3BB 


1290 


CALL TESTR 


jcouleur du point ? 


50F4 


B7 


1300 


OR A 


;vide ? 


50F5 


CA1051 


1310 


JP Z.L2060 


;oui:pDU5ser a gauche 



118 I GRAPHEMES EN ASSEMBLEUR SUR AMSTRAD 







1320 \ 










1330 jXG est du bord, pousser 


a draite 






1340 ; 






50F8 


ED5B0C53 


1350 L2020: 


LD DE,(«0DE) 




5BFC 


210000 


1360 


LD HL,0 




50FF 


CDF3BB 


1370 


CALL TESTR 


;a droite 


5102 


B7 


1380 


OR A 


;IL Y A UNE COULEUR ? 


5103 


C2F850 


1390 


JP NZ,L2020 


;0UI: toujour s du bord 


5106 


CDC6BB 


1400 


CALL GPQS 




5109 


ED531453 


1410 


LD iXG),0E 


jnouvel xg 


5L0D 


C38851 


1420 
1430 ; 


JP L2210 


;5uite 



5110 DD360100 

5114 ED5B0E53 

5118 210000 

51 IB CDF3BB 

51 IE B7 

51 IF C24951 

5122 110000 

5125 2AIA53 

5128 CDF3BB 

512B B7 

512C C23D51 

512F DD360101 

5133 CDC6BB 

5136 ED531C53 

513A 22IE53 

513D 1100G0 

5140 2A1853 

5143 CDC3BB 

5146 C31451 

5149 CDC6BB 
514C 2A0C53 
514F 19 

5150 221453 

5153 AF 

5154 DDBE01 
5157 CA8851 



1440 ;xg n'est pas du bord, la caler a gauche 
1450 JtOUt en verifiant la ligne du dessous pour 
1460 ;detecter les points critiques 
1470 ; 

LD UX+1),0 

LD DE, (NI1QDE) 

LD HL,0 

CALL TESTR 



GR 
JP 



A 

NZ,L2140 



LD DE.0 

LD HL,(NDaY) 

CALL TESTR 

OR A 

JP NZ,L2120 

LD (IX+l) t i 
CALL GPQS 



1480 L2060: 

1490 L2070: 

1500 

1510 

1520 

1530 

1540 ; 

1550 

1560 

1570 

1580 

1590 

1600 ; 

1610 

1620 

1630 

1640 

1650 ; 

1660 L2120: 

1670 

1680 

1690 

1700 ; 

1710 L2140: 

1720 

1730 

1740 

1750 

1760 

1770 

1780 ; 

1792 ;Enregistrer un point critique 

1800 : 



jraise a zero flag 



;vide ? 

;non:on est a gauche au max 



;du bord ? 
;oui,pas de problems 



LD 
LD 



tX2),DE 
IY2) ,HL 



LD 

LD 



DE,0 

hl,(DELy: 
call i1qver 

JP L2870 



CALL GPOS 

LD HL,(M0DE) 
HL,DE 
(XB),HL 
ft 1 

(IX+1) 
Z,L2210 



ADD 

LD 

XQR 

CP 

JP 



jnouvel xg cale a gauche bord 

;flag critique ? 
;non,pas de pr obi erne 



ROUTINES GRAPHIQUES DU SYSltME I 119 



515A 2A1C53 


1810 


LD HL t (X2) 




515D ED5B0E53 


1820 


LD DE,(NMGDE) 




5161 19 


1830 


ADD HL,DE 




5162 EB 


1B40 


EX DE,HL 




5163 2A2253 


1850 


LD HL,(PILE) 




5166 CDFE52 


1860 


CALL PUSHDE 




5169 ED5B1C53 


3870 


LD DE,(X2) 




516D CDFE52 


1880 


CALL PUSHDE 


;XD 


5170 ED5B1E53 


1890 


LD DE,(Y2) 




5174 CDFE52 


1900 


CALL PUSHDE 


;y 


5177 ED5B1A53 


1910 


LD DE,(NDELY) 




517B CDFE52 


1920 


CALL PUSHDE 


idirectian zone 


517E 222253 


1930 


LD (PILE) ,HL 




5191 3A0853 


1940 


LD A, (STACK) 




5184 3C 


1950 


INC A 




5185 320853 


1960 
1970 ; 


LD (STACK), A 






1980 jFINl de recadrer ;<g, passer a xd 


. Travail identique 




1990 ; 






5188 ED5B1653 


2000 L2210: 


LD DE,(XD> 




51BC 2A1253 


2010 


LD HL,(Y) 




51QF CDC0BB 


2020 
2030 ; 


CALL MOVE 


joove xd,y 


5192 110000 


2040 


LD DE,0 




5195 210000 


2050 


U) HL,B 




5198 CDF3BB 


2060 


CALL TESTR 


;cauleur du point ? 


519B B7 


2070 


OR A 


;vide ? 


519C CAB751 


2080 
2090 ; 


JP Z,L2270 


jouiipcusser adroite 




2100 ;XD est du bord,pou55er a gauche 






2110; 






519F ED5B0E53 


2120 L2238: 


LD DE,(NMQDE) 




51A3 210000 


2130 


LD HL,0 




51A6 CDF3BB 


2140 


CALL TESTR 




51A9 B7 


2150 


OR A 


;tou jours du bord ? 


51AA C29F51 


2160 


JP NZ,L2230 


;tou jours du bord 


51AD CDC6BB 


2170 


CALL6P0S 




51B0 ED531653 


2180 


LD (XD),DE 


jnouvel xd 


51B4 C32D52 


2190 

2200 ; 


JP L2430 





51B7 


DD360100 


51BB 


ED5B0C53 


51BF 


210000 


51C2 


CDF3BB 


51C5 


B7 



2210 ;xd n*est pas du bord, le caler a droite 

2220 jen regardant la ligne d'avant pour les 

2230 ; points critiques 

2240 ; 

2250 L2270; LD UX-»1),0 ;i»ise a zero flag 

2260 L2280: LD DE, (MODE) 

2270 LD HL,0 

2280 CALL TESTR 

2290 OR A ;tou jours du bord ? 



120 I GRAPHEMES EN ASSEMBLEUR SUR AMSTRAD 



51C6 C2F051 



51C9 
51CC 

51CF 
51D2 
51D3 

51D6 
51DA 
51DD 
51E1 

51E4 
51E7 
51EA 



51ED 



51F0 
51F3 
51F6 
51F7 
51FA 
51FB 
51FE 



5201 
5284 
5208 
52BB 
520C 
5210 
5211 
5212 
5215 
5219 
521C 
5220 
5223 
5226 
5229 
522A 



522D 
5230 



110000 

2A1A53 

CDF3BB 

B7 

C2E451 

DD360101 
CDC6BB 
ED531C53 
221E53 

113003 
2A1853 
CDC3BB 
C3BB51 

CDC6BB 

2A3E53 

19 

221653 

AF 

DDBEB1 

CA2D52 



2A2253 

ED5B1C53 

CDFE52 

EB 

ED4B0C53 

09 

EB 

CDFE52 

ED5B1E53 

CDFE52 

ED5B1A53 

CDFE52 

222253 

3A0853 

3C 

320853 



2A1653 
ED5B1453 



2300 

2310 ; 

2320 

2330 

2340 

2350 

2360 

2370 ; 

2380 

2390 

2400 

2410 

2420 ; 

2430 L2330: 

2440 

2450 

2460 

2470 ; 

2480 L2350: 

2490 

2500 

2510 

2520 

2530 

2540 

2550 ; 

2560 jenregistrer point critique 

2570 ; 

2580 

2590 

2600 

2610 

2620 

2630 

2640 



•IP 


NZ,L2350 


LD 


DE,0 


L0 


HL.(NDELY) 


CALL 7ESTR 


OR 


A 


JP 


NZ,L2330 


LD 


(1X4-11,1 


CALL GPOS 


LD 


tX2) ,DE 


LD 


{Y2),hL 


LD 


DE,0 


LD 


HL,(DELY) 


CALL ITOER 


JP 


L2280 


CALL GPOS 


LD 


HL,(NMODE) 


ADD 


HL,DE 


LD 


(XD),HL 


XQR 


A 


CP 


UX+1) 


JP 


2,L2430 



;oui f a droite max, ok. 



; point critique ? 

;du bord ? 

; oui, pas de pr obi erne 



2650 
2660 
2670 
2680 
2698 
2700 
2710 
2720 
2730 
2740 
2750 
2760 
2770 
2780 



LD HL,(PILE) 
LD DE, (X2) 
CALL PUSHDE 
EX DE,HL 
LD BC,(HODE> 
ADD HL,BC 
EX DE,HL 
CALL PUSHDE 
LD DE,(Y2) 
CALL PUSHDE 
LD DE,(NDELY) 
CALL PUSHDE 
LD (PILE) ,HL 
LD A, (STACK) 
INC A 
LD (STACK), A 

P 

;fini de recadrer xd. au travail, 



;XD 

;Y 

jdirection zone 



L2430: LD 
LD 



HL.UD) 

be. -can 



ROUTINES GRAPHIQUES DU SYSTEME I 121 



5234 67 2790 


OR A 




5235 ED52 2800 


SBG HL,DE 


;cakul XD-XG 


5237 CB7C 2810 


BIT 7,H 


;xg-xd<0 ? 


5239 C2A850 2320 


JP N2,6LQQP 


;fini XD-HK0 


2830 ; 






523C EQ5B1453 2840 


LD DE,(XG) 




5240 2A1253 2850 


LC HL,(Y) 




5243 CDC0BB 2860 


CALL MOVE 




5246 ED5B0C53 2870 L2450: 


LD DE, (MODE) 




524A 21000B 2880 


LE HL,0 




524D CDF3BB 2890 


CALL TESTR 




5250 B7 2900 


OR A 




5251 CA4652 2910 


JP Z»L2450 


;pas borckavancer a droite au 
bore 


2920 ; 






5254 CDC6BB 2930 


CALL GFQS 




5257 2A1653 2940 


U HL f (XD) 




525A EB 2950 


EX DE,KL 




525B B7 2960 


OR A 




525C ED52 2970 


SBC HL,DE 


jcalcul XPQS-XD 


525E CB7C 2980 


BIT 7,H 


;XPQB<XD ? 


5260 C27A52 2998 


JP NZ,L2500 


;oui, prcbleme 


3000 ; 






5263 ED5B0E53 3010 


LD DE,(OTDE) 




5267 210000 3020 


LD HL,0 




526A CDC3BB 3030 


CALL MOVER 




526D ED5B1453 3040 


LD DE,(X6) 




5271 2A1253 3050 


LD HL f (Y) 




5274 CDF6BB 3060 


CALL DRAW 


;on reaplit la ligne ! 


5277 C3F052 3070 


JP L2620 


}fim pour cette ligne 


3080 ; 






527A CDC6BB 3090 L2500: 


CALL 6PQS 




527D ED532053 3100 


LD (XS) ,D£ 


;5auvegarde xpos 


5281 ED5B0E53 3110 


LD DE,(NKQDE) 




5285 210000 3120 


LD HL f 




5288 CDC3BB 3130 


CALL HOVER 




528B ED5B1453 3140 


LD DE,(XG) 




528F 2A1253 3150 


LD HL,<Y) 




5292 CDF6BB 3160 


CALL DRAW 


;on reaplit 


5295 ED5B2053 3170 


LD DE,(XS) 




5299 2A1253 3180 


LD HLjffl 




529C CDC0BB 3190 


CALL MOVE 


jrepositionne 


3200 ; 






529F ED5B0C53 3210 L2530 


. LD DE,(IUDE) 




52A3 210080 3220 


LD HL.0 




52A6 CDF3BB 3230 


CALL TESTR 




52A9 B7 3240 


QR A 




52AA C29F52 3250 


JP MZ,L2530 


;du bord 


3260 ; 







122 I GRAPHEMES EN ASSEMBLEUR SUR AMSTRAD 



52AD CDC6BB 


3270 


CALL GPOS 




52B0 EB 


3230 


EX DE,HL 




52B1 ED5B1653 


3290 


LD DE,(XD) 




52B5 B7 


3300 


OR A 




52B6 ED52 


3310 


SSC HL,DE 


;calcul tie xpos-xd 


52B8 CB7C 


3320 


BIT 7,H 


;xpo5-xd>=0 ? 


52BA CAF052 


3330 

3340 ; 


JF Z,L2620 


;oui, pas de problems 




3350 ;paint critique 






3360 ; 






52BD CDC6BB 


3370 


CALL GPOS 




52C0 2A2253 


3330 


LD HL,(PILE) 




52C5 CDFE52 


3370 


CALL PUSHDE 


;xg=xpos 


52C6 ED5B1653 


3430 


LD 0E f (XD) 




52CA CDFE52 


3410 


CALL PUSHDE 




52CD ED5B1253 


3420 


LD DE,(Y) 




52D1 CDFE52 


3430 


CALL PUSHDE 




52D4 ED5B1B53 


3440 


LD 0E,(DELY) 




52D8 CDFE52 


3450 


CALL PUSHDE 




52DE 222253 


3460 


LD (PILE) ,HL 




52DE 2A2053 


3470 


LD HL,(XS) 




52E1 ED5B0E53 


3480 


LD DE,(N«0DE) 




52E5 19 


3490 


ADD HL,DE 




52E6 221653 


3500 


LD (XD) ,HL 


jabandonner zone crit 


52E9 3A0853 


3510 


LD A, (STACK) 




52EC 3C 


3520 


INC A 




52ED 32B853 


3530 
3540 ; 


LD (STACK! ,A 






3550 ;FIN DU TRAVAIL SUR LA LIGNE, 


passer a la euivante 




3560 ; 






52F0 2A1253 


3570 L2628: 


LD HL,(Y) 




52F3 ED5B1853 


3580 


LD DE,(DELY) 




52F7 19 


35V0 


ADD HL,DE 




52F8 221253 


3600 


LD <Y),HL 




52FB C3E150 


3610 

3620 ; 


JP NEVLIM 






3630 SIMULATION PILE 






3640 ; 






52FE 73 


3650 PUSHDE 


; LD (HL),E 




52FF 2B 


3660 


DEC HL 




5300 72 


3670 


LD (HL) ,D 




5301 2B 


3680 


DEC HL 




5302 C9 


3690 

3700 ; 


RET 




5303 23 


3710 PQPEE: 


INC HL 




5304 56 


3720 


LD D,(HL) 




5305 23 


3730 


INC H 




5306 5E 


3740 


LD E, (HL) 




5307 C9 


3750 


RET 





ROUTINES GRAPHIQUES DU SYST&ME I 123 



5308 0000 

530A 0000 

530C 0000 

53BE 0000 

5310 0000 

5312 0000 

5314 0008 

5316 0000 

5318 0000 

531A 0000 

531C 0000 

531E 0000 

5320 0000 
5322 



3760 *l> 
3770 STACK: 

3780 COUL; 
3790 MODE: 
3800 OTDE: 
3810 X: 
3820 Y: 
3830 XG: 
3840 XD: 
3850 DELY: 
3860 NDELY: 
3870 X2: 
3880 Y2: 
3e?0 XS: 
3900 PILE: 



DEFW 

DEFW 
DEFW 
DEFW 
EEFW0 
DEFW 
DEFW 
DEFW 
DEFW 
DEFW 
DEFW 
DEFW 
DEFW 
DEFW 



Pass 2 errors: 00 



10 '******************** 

28 '** Programme 3-7 ** 

30 ' ******************** 

40 * 

50 'programme de remplissage de zones en LM 

60 'transposition du programme 3-6 

70 ' 

80 MEMORY &2FFF 

90 DEFINT a-z 

100 ad=&50Q0:lign=180 

110 ctrl=0:READ c$ : IF c*="fin" THEN 580 

120 FOR i=l TO LEN<c$) STEP 2 

130 c=VAL<"&"+MID$<c:$,i ,2) ) 

140 POKE ad,c:ad=ad+l:ctrl=ctrl+c 

150 NEXT: READ teste: IF testeOctrl THEN PRINT"Er 

rear DATA ligne" 1 ign:END 
160 lign=lign+10:GOTO 110 

170 ' 

180 DATA FD210B53FD36000221FF3F222253DD210A532A0 

C, 1539 
170 DATA 537D2F6F7C2F6723220E53CDC6BBED53 1053221 

2, 1867 

200 DATA 53ED5B0E53210000CDF3BBB7CA2950CDC6BE2A0 

C, 2326 

210 DATA 5319221453ED5B10532A1253CDC0BBED5BBC532 

1, 1855 
220 DATA 0000CDF3BBB7CA4B50CDC63B2A0E531919ED531 



&■■ 



96 



124 I GRAPHEMES EN ASSEMBLEUR SUR AMSTRAD 

230 DATA 532A1053ED5B0E5319EB2A2253CDFE52ED5B105 

3, 2036 
240 DATA CDFE52ED5B12531313CDFE52110200CDFE52ED5 

B, 2437 
250 DATA 1453CDFE52ED5B1653CDFE52ED5B1253CDFE521 

1, 2605 
260 DATA FEFFCDFE522222533A0853B7C82A2253CD0353E 

D , 2420 
270 DATA 5318537B2F5F7A2F5713ED531A53CD0353ED531 

2, 1788 
280 DATA 53CD0353ED531653CD0353ED5314532222533A0 

8, 1730 
290 DATA 533D320353ED5B14532A1253CDC0BB1 10000210 

0, 1493 
300 DATA 00CDF3BBB7CA1051ED5B0C53210000CDF3BBB7C 

2 , 2585 
310 DATA FS50CDC6BBED531453C38851DD360100ED5B0E5 

3, 2454 
320 DATA 2 1 0000CDF3BBB7C2495 111 00002A 1 A53CDF3BBE 

7, 2185 
330 DATA C23D51DD360101CDC6BBED531C53221E5311000 

0, 1798 
340 DATA 2A1B53CDC3BBC31451CDC6BB2A0C5319221453A 

F, 2096 
350 DATA DDBE01CA8S512A1C53ED5B0E5319EB2A2253CDF 

E, 2287 
360 DATA 52ED5B1C53CDFE52ED5B1E53CDFE52ED5B1A53C 

D, 2686 
370 DATA FE522222533A08533C320853ED5B16532A1253C 

D, 1618 
380 DATA C0BB110000210000CDF3BBB7CAB751ED5B0E532 

1, 2171 
390 DATA 0000CDF3BBB7C29F51CDC6BBED531653C32D52D 

D, 2810 
400 DATA 360100ED5B0C53210000CDF3EBB7C2F051 11000 

0, 1861 
410 DATA 2A1A53CDF3BBB7C2E451DD360101CDC6BBED531 

C, 2687 
420 DATA 53221E531100002A1853CDC3EBC38B51CDC6BB2 

A, 2078 
430 DATA 0E5319221653AFDDBE01CA2D522A2253ED5B1C5 

3, 1775 
440 DATA CDFE52EBED4B0C5309EBCDFE52ED5B1E53CDFE5 

2, 2950 
450 DATA ED5B1A53CDFE522222533A0S533C320S532A165 

3, 1626 
460 DATA ED5B1453B7ED52CB7CC2A850ED5B14532A1253C 

D, 2481 



ROUTINES GRAPHIQUES Dtl SYSTEME I 125 

470 DATA C0BBED5B0C53210000CBF3BBB7CA4652CDC6EB2 

A, 2639 
480 DATA 1653EBB7ED52CB7CC27A52ED5B0E532100GKBCDC 

3, 2425 
490 DATA BBED5B14532A1253CDF6BBC3F052CDC6BBED532 

0, 2853 
500 DATA 53ED5B0E53210000CDC3BBED5B14532A1253CDF 

6, 2153 
510 DATA BBED5B20532A1253CDC0BBED5B0C5321000tfCDF 

3, 2261 

520 DATA BBB7C29F52CDC6BBEBED5B1653B7ED52CB7CCAF 

0, 3334 

530 DATA 52CDC6BB2A2253CDFE52ED5B1653CDFE52ED5B1 

2, 2692 
540 DATA 53CDFE52ED5B1S53CDFE522222532A2053ED5B0 

E, 2250 
550 DATA 53192216533A0Q533C3208532A1253ED5B1B531 

9, 1200 
560 DATA 221253C3E150732B722BC92356235EC9, 1602 
570 DATA "fin" ,0 
580 RANDOMIZE TIME/300 
590 DEFINT a-z 
600 MODE 

610 FOR i=0 TO 15! INK i,i-*2:NEXT 
620 FOR i = l TO 20s MOVE 640*RND , 400*RND 
630 DRAW 640*RND,400*RND,2+IJMT<RND*13) : NEXT 
640 PLOT 0,0: DRAW 639,0: DRAW 639,350: DRAW 0,350: 

DRAW 0,0 
650 PLOT 800,800,1: MOVE 300,200 
660 c=l 
670 60SUB 700 
680 LOCATE 1 , 1 : PRINT"TAPE2 UNE TOUCHE POUR CONTI 

NUER" 
690 WHILE INKEY$="": WEND: RUN 590 
700 base=&5308:POKE base+2, 1 : POKE base+4,4: CALL 

&500O 
710 RETURN 



Remarques sut la routine assembleur 

Cependant, il convient de remarquer la zone associee au stockage des 
points particuliers. Pour eviter un ecrasement de la pile systeme, une pile 
simul6e est utilisee, plac6e a I'adresse $3FFF. Cette pile est geree par les 
routines POPDE et PUSHDE qui placent ou retirent le registre DE dans cette 
pile, en remettant a jour le pointeur de pile HL II faut bien comprendre que 



126 i GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 

la pile ainsi simulee remonte en memoire vers le bas : si beaucoup de 
points speciaux se presentent dans la pile, celle-ci va se rapprocher de 
$3000. C'est pourquoi le programme Basic appelant place un MEMORY 
&2FFF. Cela reserve un espace de 4 Ko pour cette pile, permettant de 
stocker ainsi 500 points speciaux. C'est une prevision pessimiste : il 
suffirait de prevoir de la place pour une vingtaine de points. Mais encore 
une fois, il vaut mieux penser au pire, et prevoir large. Notez egalement 
qu'il est impossible de prevoir I'encombrement de cette pile. Nous ne 
connaissons pas le nombre de points speciaux a I'avance. C'est pourquoi 
nous ne pouvons pas prendre le risque de la placer au-dessus des routines. 
La seule solution est de I'installer totalement en dehors de la zone des 
programmes. 

Vous constatez toutefois, dans cette application, I'importance des rou- 
tines systeme. Sans elles, les tests seraient un veritable calvaire. Le point 
que nous avions souligne apparaTt maintenant clairement : lorsque ('appli- 
cation necessite un acces individuel des points et un systeme de coordon- 
nees, le pack systeme integre est plus qu'utile. 



L'ACCES DIRECT A 
A LA MEMOIRE ECRAN ** 



128 ! GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 



OBJETS GRAPHIQUES 



Nous I'avons constate de facon spectaculaire lors des precedents 
chapitres, le traitement des graphismes par un acces direct a la memoire 
ecran est beaucoup plus rapide que ('utilisation des routines systeme. Le 
fait d'allumer un point par POKE ou LD en LM est un facteur de Vitesse 
essentiel. Mais nous avons egalement pu affronter les difficultes de 
prograrnmation de ce langage. 

Pour obtenir un compromis qui soit assez facile a programmer et tout de 
meme tres rapide, nous allons devoir jongler avec les octets et la memoire 
ecran. 

Nous devons avant tout definir une contrainte essentielle : quel que soit 
le but vise, nous devrons traiter les graphismes sous forme d'objets 
graphiques. Cela suppose que nous devrons coder en memoire ou sur 
memoire de masse tous les objets a manipuler avant de pouvoir traiter 
ceux-ci sur I'ecran. 

Comment peut-on definir un objet graphique? Certains constructeurs 
ont inclus dans leur machine un processeur ou des routines capables de 
gerer des sprites ou lutins. Ces lutins correspondent exactement k ce que 
nous appelons un objet graphique. lis represented, sous la forme d'un 
certain nombre de donnees en memoire, un dessin a placer sur I'ecran 
selon certaines regies. 




&JJVn^?l Zone recouverte 
j£M-:v;;! P ar I 'objet 



ECRAN 



OBJET 



Schema 4.1 



Objet graphique. 



ACCES DIRECT MEMOIRE ECRAN I 129 

Pour notre part nos objets graphiques devront utiliser un format 
standard qui leur sera comrnun. II faudra egaiement que nous puissions les 
sauver sur cassette ou disquette ou les traiter facilement. 

Si nous considerons par exemple la totalite de I'image ecran comme un 
objet, nous pouvons sauver cet objet par une simple commande Basic : 

SAVE "ECRAN",B,&COOO,&4000 

Cette commande indique que nous voulons sauver, dans un fichier 
nomme ECRAN.BIN, le contenu de la memoire des adresses &CO0O a 
&COOO-I-&4000. Cela sauvegarde dans le fichier la totalite de la memoire 
ecran. Vous pouvez ensuite recharger I'objet n'importe ou en memoire par 
une commande comme LOAD"ECRAN". II est possible, ainsi, de stocker 
I'ecran ailleurs que dans la memoire ecran, done sans I'afficher tel qu'il a 
ete sauve. Le probleme de cette commande, e'est qu'elle genere un fichier 
de 16 Ko. Si nous traitons des objets de ce type, nous ne pourrons en 
stocker que deux en memoire, plus un affiche. Inutile de dire qu'il est 
inconcevable de traiter des ecrans entiers. 

La plupart des jeux d'action recents manipulent une cinquantaine, voire 
une centaine d'objets differents sans aucun chargement de fichier. Tous 
ces objets sont stockes en memoire et affiches, effaces, selon les directives 
du programme. Nous nous pencherons dans les chapitres suivants sur les 
problemes de gestion des objets graphiques. Pour I'instant, notre preoccu- 
pation est la suivante : comment stocker en memoire un objet graphique 
facile a afficher et a memoriser ? 



STRUCTURE DE LA MEMOIRE ECRAN 



Si vous avez lu les chapitres precedents, vous savez que la memoire 
ecran possede une structure relativement deroutante. L'adresse $C000 
represente le coin superieur gauche de I'ecran, $C001 est la zone situee a sa 
droite, $C002 encore un peu plus a droite, et ainsi de suite. Tout devient 
curieux lorsque nous arrivons a $C04F. En effet, cette adresse represente la 
derniere zone de la ligne du haut de I'ecran. La logique voudrait que 
l'adresse suivante, $C050, represente la gauche de la deuxieme ligne. 
Malheureusement, elle represente la gauche de la neuvieme ligne. 

Nous nous sommes deja penches sur cette organisation mysterieuse. 
Elle est due a une astuce permettant une synchronisation facile du 
balayage video et des affichages, ce qui donne un aspect net a I'ecran. Mais 
cette astuce materielle ne facilite pas la programmation : en effet, le 
traitement des objets graphiques est facile tant qu'on ne change pas de 
ligne graphique. II suffit, pour progresser vers la droite sur I'ecran, 
d'ajouter 1 a l'adresse, et de retrancher 1 pour revenir en arriere. En 
revanche, tout se complique si Ton doit passer a la ligne du dessous ou du 
dessus. L'adresse n'est pas simple a calculer. 



130 i GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 

Fort heureusement plusieurs solutions existent pour vaincre cet obsta- 
cle. La plus simple des solutions consiste a utiliser les quatre routines 
fournies par le logiciel systeme. En effet, Amstrad a juge utile de fournir 
des routines calculant les adresses ecran a partir d'une adresse donnee. 
Ainsi, si I'adresse actuelle est dans ie registre 16 bits HL r un CALL #BC26 
calcuiera dans HL I'adresse de la position graphique situee une ligne plus 
bas. Et cela simplifie grandement les routines de traitement. 

Un inconvenient : ces appels de routines raientissent le deroulement des 
operations. En effet, leur programmation tient compte d'eventuels deca- 
lages en RAM suite a un eventuel scrolling. Cela vient d'une autre astuce 
materielle. Elle ne nous interesse pas ici ; en effet nous ne ferons jamais de 
scrolling lors de nos programmes. Apres un scrolling, I'adresse $COO0 ne 
represente pas forcement le coin en haut a gauche ! Ce qui ne simplifie pas 
une tache deja ardue pour les programmes. 

Done, ces quatre routines systeme sont d'un emploi simple (et ne 
modifient aucun autre registre que HL, ce qui les rend encore plus 
tentantes), mais lent. Attention, lent ne veut pas dire ici inexploitable. Elles 
sont lentes dans la mesure ou elles font plus que ce qu'on leur demande. 



Une autre solution, plus astucieuse, consiste a faire ses propres routines. 
Cela implique une bonne connaissance de I'arithmetique 16 bits Z-80. Pour 
information, voici la routine qui permet de descendre d'une ligne dans HL : 

GOBAS: PUSH BC : sauvegarde du registre BC pour 

travail ; 
LD BC,#800 : cela est I 'offset dans un cas normal ; 

ADD HL.BC : passe a la ligne suivante dans cas 

normal ; 
JP NC,FINAL ; e'etait bien un cas normal ; 

LD BC,#C050 : offset pour revenir d'un bloc de huit 

lignes ; 
ADD HL,BC : repositionne sur la bonne ligne ; 
FINAL: POP BC : recupere BC ; 

RET : fin et retour. 

II est relativement facile de programmer, selon le meme principe, une 
routine remontant d'une ligne. 

• 

II y a une derniere solution tres interessante : elle consiste a utiliser ce 
qu'on appelle une table d'index. Pour ce faire, on range en memoire les 200 
adresses de debuts de ligne de I'ecran. Pour se placer a la ligne 48, 20* 
octet, on prend la 48* adresse de la table, & laquelle on ajoute 20. Rien de 
plus. 

Cette solution est encombrante mais rapide. Elle permet notamment de 
calculer directement et simplement une adresse ecran d'apres des coor- 
donnees. Nous ne I'utiliserons pas dans ce livre (sauf dans le programme 
du chapitre 9). 

Pour I'heure, nous allons nous contenter des routines systeme, qui ont 
tout de m6me I'avantage de la clart6. 



- 



ACCES DIRECT MEMOIRE ECRAN I 131 

RESTITUTION DES OBJETS 



Notre principal probleme est le suivant : alors que la structure de I'ecran 
n'est pas lineaire en memoire, nous devons gerer des objets graphiques 
qui seront places en memoire dans un bloc compact d'octets. Tout va bien 
si les objets n'utilisent qu'une seule ligne graphique de I'ecran. Mais il va 
de soi qu'un tel cas est extremement rare. La plupart du temps, les objets 
occuperont un certain nombre de lignes. 

La solution est de definir un format standard des objets. En I'occurrence, 
le format le plus pratique est generalement le rectangle. Si chaque objet est 
place dans un rectangle avant sa memorisation, il sera caracterise par sa 
largeur et sa hauteur. Nous saurons alors combien d'octets de I'objet 
constituent une ligne de I'ecran (grace a la largeur) et combien de lignes il 
utilise (grace & la hauteur). L'algorithme de dessin a partir de I'objet sera 
alors le suivant : 

• Pour H (hauteur) lignes : 

Envoyer L (largeur) octets sur I'ecran. 
Descendre d'une ligne sur I'ecran. 

• Suite du dessin. 

Bien entendu, cela est tres simple a programmer, mais nous impose tout 
de meme plusieurs contraintes. Tout d'abord, puisque nous travaillons a 
partir d'octets et non de points, nous n'aurons plus acces a chaque point 
individuellement. De plus, nous devrons coder les dessins avant leur 
memorisation. 

Avant de nous penchersur la gestion des objets, nousallons prendre une 
grave decision : seul le MODE sera utilise. En effet, il est le seul a 
proposer seize stylos differents. Nous avons besoin de couleurs pour les 
objets car nous les utiliserons la plupart du temps dans des jeux. De plus, 
dans ce mode, un octet de la memoire ecran ne comporte que deux points 
graphiques. L'impossibilite de traiter chaque point sera done moins 
contraignante, et de plus, nous le constaterons plus tard, nous pourrons 
tout de meme acceder sans trop de difficulty a chacun des points d'un 
octet. 

Nous devons realiser deux routines : Tune codera un dessin en memoire, 
I'autre dessinera un objet sur l'6cran. 

En effet, il est beaucoup plus simple de dessiner un objet point par point 
que de le coder octet par octet. Pour ce travail, il faudrait utiliser une table 
des masques et calculer chaque octet. Nous pouvons nous faciliter ce 
travail car le codage des dessins n'a lieu qu'une seule fois : il faut les coder 
avant de programmer I'application. Une fois les objets codes, nous n'avons 
plus besoin de leur dessin point par point, seul nous importe I'objet place 
en memoire, directement utilisable par la routine de restitution d'objet. 



132 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 

La routine de codage d'un objet est simple. On commence par dessiner 
I'objet point par point en haut de I'ecran et a gauche, puis on le code ligne 
apres ligne a une adresse fixe de la memoire. II taut bien sur pour cela 
connaitre sa largeur et sa hauteur. Une fois le codage acheve, on peut le 
sauver sous forme de fichier binaire. 



10 ' 

20 'programme de creation de decor 

30 'dessine le decor destine aux routines des ch 

apitres 4 a 8 
40 ' et cree le -fichier binaire correspandant 
50 'NDA S 
60 'evitez les erreurs, tapez ce listing en mode 

2 (80 caracteres par ligne): 
70 'chaque data hex a comporte exactement 80 car a 

cteres (le dernier tape arrive 
G0 'juste en dessous et a gauche du premier). 
90 'Bon courage ! 
100 * 

110 MODE 
120 FOR 1=0 TO 15 

130 INK I,ASC(MID$("ACLFSPSJOCJXSDZQ" ,1+1,1) ) -65 
140 NEXT 
150 ' 

160 'a-ffichage haut ecran 
170 ' 

180 ae=49152:lign=460 
190 ad=ae 
200 FOR o=l TO 2 

210 ctrl=0:READ c$: IF c*="fin" THEN 320 
220 FOR i=l TO LEN(c$) STEP 2 
230 c=VAL<"4c"-H1ID*(c*,i ,2) ) 
240 POKE ad,c:ad=ad+l:ctrl=ctrl+c 
250 NEXT:READ teste: IF testeOctrl THEN PRINT"Er 

reur DATA 1 igne"l i gn: END 
260 lign=lign+10 
270 NEXT o 

280 ae=ae+&800: IF ae>65535 THEN dfi-afc+-'<C050 
290 GOTO 190 
300 ' 
310 * 

320 ae=64768 
330 ad=ae 
340 FOR o=l TO 2 

350 ctrl=0:READ c*: IF c*="fin" THEN 44t 
360 FOR i = l TO LEN<c$> STEP 2 
370 c=VAL("&"+MID*<c$ f i f 2) ) 
380 POKE ad,c:ad=ad+l:ctrl=ctrl+c 
390 NEXT:READ teste: IF testeOctrl THEN PRINT"Er 

reur DATA ligne"lign: END 
400 lign=lign+10 
410 NEXT a 

420 ae=ae+&800: IF ae>65535 THEN ae=ae+&C050 
430 GOTO 330 

440 SAVE "i mage ",b,S<C000, 16384 
450 ' 



ACCES DIRECT MEMOIRE ECRAN I 133 



460 DATA F3F3F3F3F3F3F3F3F3F3F3F3; 

3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3 , 97 

20 
470 DATA F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F 

3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3 f 97 

20 
4B0 DATA F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F 

3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3 , 97 

20 
490 DATA F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F 

3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3 , 97 

20 
500 DATA F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F 
3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3 , 97 

20 
510 DATA F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F 

3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3 , 97 

20 
520 DATA F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F 

3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3 f 97 

20 
530 DATA F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F 
3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3 , 97 

20 

540 DATA F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F 
3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3 , 97 

20 
550 DATA F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F 

3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3, 97 

20 
560 DATA F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F 

3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3B6 , 96 

59 
570 DATA 3C3C3C3C79F3F3F3F3F3F3F3F3F3F3F3F3F3F3F 
3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3 , B8 

66 
380 DATA F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F 
3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F33C3C3C3C3C, B8 

05 
390 DATA 3C3C3C3C3C3C3C3C3C3C3CF3F3F3F3F3F3F3F3F 

3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3, 77 

07 
600 DATA F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F 
3F3F3F3F3F3F3F3F3B63C3C3C3C3C3C3C3C3C3C3C, 76 

46 
610 DATA 3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 

CF3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3, 60 

60 
620 DATA F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F 

3F3B63C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C , 63 

65 
630 DATA 3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 
C3C3C3C3C3C3C3C3C3C3CF3F3F3F3F3F3F3F3F3F3 , 42 

30 
640 DATA F3F3F3F3F3F3F3F3F3F3F3F3F33C3C3C3C3C3C3 
C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C , 47 

79 
650 DATA 3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 
C3C3C3C3C3C3C3C3C3C3C3C3C3C3CF3F3F3F3F3F3 , 34 

98 
660 DATA F3F3F3F3F3F3B63C3C3C3C3C3C3C3C3C3C3C3C3 



134 l GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 



C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C , 36 

20 
670 DATA 3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 

C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C79F3F3F3 , 30 

10 
680 DATA F3F3F3F33C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 

C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C , 3 1 

32 
690 DATA 3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 

C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C79F3 , 26 

44 
700 DATA F3F3B63C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 

C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C , 28 

88 
710 DATA 3CF0F0F0F03C3C3C3C3C3C3C3C3C3C3C3C3C3C3 

C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C79 , 3 1 

81 
720 DATA 3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 

C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3CF0F0 , 27 

60 
730 DATA F0F0F0F0F0F0F0F0B43C3C3C3C3C3C3C3C3C3C3 

C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C , 39 

60 
740 DATA 3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 

C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3CF0F0F0F0F0 , 33 

00 
750 DATA F0F0F0F0F0F0F0F0F0F0F0F0B43C3C3C3C3C3C3 

C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C , 46 

80 
760 DATA 3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 

C3C3C3C3C3C3C3C3C3CF0F0F0F0F0F0F0F0F0F0F0 , 43 

80 
770 DATA F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F03C3C3 

C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C , 54 

60 
780 DATA 3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 

C3C3C78F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 , 55 

20 
790 DATA F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F 

0F0B43C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C , 63 

00 
800 DATA 3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C78F0F 

0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0FO , 64 

20 
810 DATA F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F 

0F0F0F0F03C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C , 67 

20 
820 DATA 3C3C3C3C3C3C3C3C3C3C3C3C3C3C78F0F0F0F0F 

0F0F0F0F0F0F0F0F0F0F0F0FOF0F0F0F0F0F0F0F0 , 69 

60 
830 DATA F0F03F3F3F3FF0F0F0F0F0F0F0F0F0F0F0F0F0F 

0F0F0F0F0F0F0B43C3C3C3C3C3C3C3C3C3C3C3C3C , 64 

92 
840 DATA 3C3C3C3C3C3C3C3C3C3C7SF0F0F0F0F0F0F0F0F 

0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F03F , 75 

03 
350 DATA 3F3F3F3F3F3F3F3F3F3F7AF0F0F0F0F0F0F0F0F 

0F0F0F0F0F0F0F0F0F0B43C3C3C3C3C3C3C3C3C3C , 58 

52 
S60 DATA 3C3C3C3C3C3C3CF0F0F0F0F0F0F0F0F0F0F0F0F 

0F0F0F0F0F0F0F0F0F0F0F0B53F 'F3F3F3F3F3F3F , 68 

65 



ACCES DIRECT MEM01RE £'CRAN I 135 



870 DATA 3F3F3F3F3F3F3F3F3F3F3F3F3F7AF0F0F0F0F0F 
0F0F0F0F0F0F0F0F0F0F0F0F0B43C3C3C3C3C3C3C , 58 
61 
880 DATA 3C3C3C3C78F0F0F0F0F0F0F0F0F0F0F0F0F0F0F 
0F0F0F0F0F0F0F03F3F3F3F3F3F3F3F3F3F3F3F3F , 64 
59 
890 DATA 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F7 
AF0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F03C3C3C3C , 53 
99 
900 DATA 3C3CF0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F 
0F0F0F03F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F , 62 
31 
910 DATA 3F3F3F3C3C3D3F3F3F3F3F3F3F3F3F3F3F3F3F3 
F3F3F3F3FF0F0F0F0F0F0F0F0F0F0F0F0F0F03C3C f 49 
84 
920 DATA 3C78F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0B 
53F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F , 57 
01 
930 DATA 3F3F3C3C3C3C3D3F3F3F3F3F3F3F3F3F3F3F3F3 
F3F3F3F3F3F3F3F3FF0F0F0F0F0F0F0F0F0F0F0B4 , 45 
70 
940 DATA F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F03F3F3 
F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F , 55 
29 
950 DATA 3F3E3C3C3C3C3C3F3F3F3F3F3F3F3F3F3F3F3F3 
F3F3F3F3F3F3F3F3F3F3F3F7AF0F0F0F0F0F0F0F0 , 39 
79 
960 DATA F0F0F0F0F0F0F0F0F0F0F0F0F0F0F03F3F3F3F3 
F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F , 51 
75 
970 DATA 3F3C3C3C3C3C3C3D3F3F3F3F3F3F3F3F3F3F3F3 
F3F3F3F3F3F3F3F3F3F3F3F3F3F3FF0F0F0F0F0F0 , 35 
62 
980 DATA F0F0F0F0F0F0F0F0F0F0F0F03F3F3F3F3F3F3F3 
F3F3F3F3F3F3F6BC3C3C33F3F3F3F3F3F3F3F3F3F , 50 
84 
990 DATA 3F3C3C3C3C3C3C3D3F3F3F3F3F3F3F3F3F3F3F3 
F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F7AF0F0F0F0 , 32 
67 
1000 DATA F0F0F0F0F0F0F0F0F03F3F3F3F3F3F3F3F3F3F 
3F3F3F6BC3C3C3C3C3C3C3C3C3C33F3F3F3F3F3F3F, 
5477 
1010 DATA 3E3C3C3C3C3C3C3C3F3F3F3F3F3F3F3F3F3F3F 
3F3FC3C3C3C33F3F3F3F3F3F3F3F3F3F3F3FF0F0F0, 
3557 
1020 DATA F0F0F0F0F0F0B53F3F3F3F3F3F3F3F3F3F3F3F 
C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3973F3F3F, 
6032 
1030 DATA 3E3C3C3C3C3C3C3C3F3F3F3F3F3F3F3F6BC3C3 
C3C3C3C3C3C3C3C3C3973F3F3F3F3F3F3F3F3FF0F0, 
4436 
1040 DATA F0F0F0F0F03F3F3F3F3F3F3F3F3F3F3FC3C3C3 
C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C33F, 
6441 
1050 DATA 3E3C3C3C3C3C3C3C3F3F3F3FC3C3C3C3C3C3C3 
C3C3C3C3C3C3C3C3C3C3C3C3973F3F3F3F3F3F3FF0, 
5271 
1060 DATA F0F0F0F03F3F3F3F3F3F3F3F3F6BC3C3C3C3C3 
C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3, 
6704 
1070 DATA 3C3C3C3C3C3C3C3C69C3C3C3C3C3C3C3C3C3C3 



136 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 



C3C3C3CFCFCFC3C3C3C3C3C3C3C3C33F3F3F3F3F7A, 

5933 
1080 DATA F0F0F03F3F3F3F3F3F3F3FC3C3C3C3C3C3C3C3 

C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3, 

6879 
1090 DATA 3C3C3C3C3C3C3C3C69C3C3C3C3C3C3C3C3C3CF 

CFCFCFCFCFCFCFCFCFCFC3C3C3C3C3C3C3973F3F3F, 

6322 
1100 DATA F0F03F3F3F3F3F3F3FC3C3C3C3C3C3C7CFCFCF 

CFCFCFCFCFCFCFCFCBC3C3C3C3C3C3C3C3C3C3C3C3, 

7110 
1110 DATA 3C3C3C3C3C3C3C3C69C3C3C3C3C7CFCFCFCFCF 

CFCFCF8E0C4DCFCFCFCFCFCFC3C3C3C3C3C3C33F3F, 

6184 
1120 DATA F0B53F3F3F3F3F6BC3C3C3C3C3C7CFCFCFCFCF 

CFCFCFCFCFCFCFCFCFCFCFCFCBC3C3C3C3C3C3C3C3, 

7299 
1130 DATA 3C3C3C3C3C3C3C3C69C3C3C3CFCFCFCFCFCFCF 

0C0C0C0CCCaC0C0C4DCFCFCFCFCFC3C3C3C3C3C33F t 

5380 

1140 DATA F03F3F3F3F3F3F6BC3C3C3CFCFCFCFCFCFCFCF 

CF8E0C0C0CCFCFCFCFCFCFCFCFCFCFCFC3C3C3C396, 

655B 
1150 DATA 3C3C3C3C3C3C3C3C3CC3C3CFCFCFCF0C0C0C0C 

0C030303030303030C0C0CCFCFCFCFCFCFC3C3C397, 

3853 
1160 DATA B53F3F3F3F6BC3C3C3C7CFCFCFCFCFCFCFCF0C 

0C0C0C0C0C0C0C4DCFCFCFCFCFCFCFCFCFCFC3C396, 

5763 
1170 DATA 3C3C3C3C3C3C3C3C3CC3C7CFCFCF0C0C0C0C0C 
0C0CCCCC89030303030C0C0C0CCFCFCFCFCFCBC3C3, 

3B72 
1 180 DATA 3F3F3F3FC3C3C3C3CFCFCFCFCFCFCF8E0C0C0C 
0C0C0C0C0C0C0C0C0C0C0C0CCFCFCFCFCFCFCFC396, 

4597 
1190 DATA 3C3C3C3C3C3C3C3C3CC3C3C3C3CFCFCFCFCFCF 
CF0C0C0C0C0C0C0C0C4DCFCFCFCFCBC3C3C3C3C3C3, 

5143 

1200 DATA 3F3F6BC3C3C3CFCFCFCFCFCFCF8E0C0C0C0C0C 
0903030303030C0C0C0C0C0C0C0C4DCFCFCFCFCB96, 

3847 
1210 DATA 3C3C3C3C3C3C3C3C3CC3C3C3C3C3C3C3C7CFCF 
CFCFCFCFCFCFCFCFCFCFC3C3C3C3C3C3C3C3C3C3C3, 

6733 

1220 DATA 3F6BC3C3C7CF0CCFCFCF8E0C0C0C0C0C030303 
0303CCCCCC03030303060C0C0C0C0C0C0C4DCFCF96, 

3171 
1230 DATA 3C3C3C3C3C3C3C3C3CC3C3C3C3C3C3C3C3C3C3 
C3C3C3C3CFCFCBC3C3C3C3C3C3C3C3C3C3C3C3C3C3, 

6617 
1240 DATA 6BC3C3CFCFCFCF0C0C0C0C0C0303030303CCCC 

CCCCCCC0C4CCCCCC03030303030C0C0C0C0C0CCF96, 

3864 
1250 DATA 3C3C3C3C3C3C3C3C3CC3C3C3C3C3C3C3C3C3C3 

C3C3C3C3C3C3C36BC3C3C3C3C3C3C3C3C3C3C3C3C3, 

6497 
1260 DATA C3C3CFCFCFCFCFCFCFCFCFSE0C0C0C09030303 

030346CCCCCC0346CCCCCC890303030C0C0CCFCBC3, 

4609 
1270 DATA 3C3C3C3C3C3C3C3C3D3F6BC3C3C3C3C3C3C3C3 

C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3, 

6366 



ACCES DIRECT MEM01RE £CRAN I 137 



1280 DATA C3C7CFCFCFCFCFCFCFCFCFCFCFCFCF8E0C0C0C 
0C03030303030303030303030C0C0C0CCFCFCBC3C3, 
4363 

1290 DATA 3C3C3C3C3C3C3C3C3D3F3F3F3F6BC3C3C3C3C3 
C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3973F3F3F, 

5530 
1300 DATA C3C3C3C3C3C3C3C3C3C3C3CFCFCFCFCFCF8E0C 
0C0C0C0C0C0C0C0C0C0C0C0C0C4DCFCFCBC3C3C3C3, 

5171 
1310 DATA 3C3C3C3C3C3C3C3C3D3F3F3F3F3F3F3F3F3FC3 
C3C3C3C3C3C3C3C3C3C33F3F3F3F3F3F3F3F3F3F3F, 

3946 
1320 DATA C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3CFCFCFCF 
CFCFCFCF0C0C0C0C0C0C0C4DCFCFCBC3C3C3C3C3C3, 

6529 
1330 DATA 3C3C3C3C3C3C3C3C3D3F3F3F3F3F3F3F3F3F3F 
3F3FC3C3C3C33F3F3F3F3F3F3F3F3F3F3F3F3F3F3F, 

3022 
1340 DATA 3F3F3F3F3F3F6BC3C3C3C3C3C3C3C3C3C3CFCF 

CFCFCFCFCFCFCFCFCFCFCFCFCBC3C3C3C3C3C3C33F, 

6964 
1350 DATA 3E3C3C3C3C3C3C3C3F3F3F3F3F3F3F3F3F3F3F 

3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F, 

2498 
1360 DATA 3F3F3F3F3F3F3F3F3F3F3FC3C3C3C3C3C3C3C3 

C3C3C3C3C-3C3C3C3C3C3C3C3C3C3C3C3C3973F3F3F, 

5908 
1370 DATA 3E3C3C3C3C3C3C3C3F3F3F3F3F3F3F3F3F3F3F 

3F3F3F3F3F3F3F3F3F3F3F3F7A3F3F3F3F3F3F3F3F, 

2557 
1380 DATA 3F3F3F3F3F3F3F3F3F3F3F3F3F3FC3C3C3C3C3 
C3C3C3C3C3C3C3C3C3C3C3C3C3973F3F3F3F3F3F3F, 

4984 
1390 DATA 3E3C3C3C3C3C3C3C3F3F3F3F3F3F3F3F3F3F3F 
3F3F3F3F3F3F3F3F3F3F3F3FE1F03F3F3F3F3F7AF0, 

3073 
1400 DATA 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F6BC3 
C3C3C3C3C3C3C3C3C3C33F3F3F3F3F3F3F3F3F3F3F, 

4016 
1410 DATA 3F3C3C3C693C3C3D3F3F3F3F3F3F3F3F3F3F3F 

3F3F3F3F3F3F3F3F3F3F3FF0C3C3F03F3F7AF0F0F0, 

3753 
1420 DATA F0F03F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F 

3F3F3F6BC3C3C33F3F3F3F3F3F3F3F3F3F3F3F3F3F, 

3314 
1 430 DATA 3F3C3C69C3963C3D3F3F3F3F3F3F3F3F3F3F3F 
7A3F3F3F3F3F3F3F3F7AF0C3C3C3C378F0F0F0F0F0, 

4535 
1440 DATA C378F0F0F0B53F3FB4B53F3F3F3F3F3F3F3F3F 
3FF03F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F, 

3770 
1450 DATA 3F3E3CC3C3963C3F3F3F3F3F3F3F3F3F3F3F3F 

E 1 F03F3F3F3F3F3FF0E 1 C3C3C3C3C378F0F0F0F0F0 , 
5144 
1460 DATA C396F0F0F0F0F0F069B53F3F3F3F3F3F3F3F3F 
7AC3B53F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F, 

4270 
1470 DATA 3FF0C3C3C3C33C3F3F3F3F3F3F3F3F3F3F3F7A 
C3C3B53F7AF0B4F0C3C3C3C3C3C3C3963C78F0F0F0, 

5789 
1480 DATA C3C378F0F0F0F0B4C378F0F03F3F3F3F3F3F3F 



138 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 



B4C3D23F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F, 
4605 

1490 DATA F0C3C3C3C3C33D3F3F3F3F3F3F3F3F3F3F3F69 
C3C396F0F03C69C3C3C3C3C3C3C3C3C3CB9678F0F0, 
5967 

1500 DATA C3C396F0F0F0F069C396F0F0F0F0F03F3F7AB4 

69C3C3F0B53F3F3F3F3F3F3F3F3F3F3F3F3F3F3F7A, 

5561 
1510 DATA C3C3C3C3C3C33F3F3F3F3F3F3F3F3F3F3F7A69 

C3C3C378B4C3C3C3C3C3C3C3C3C3C3C3CBC39678F0, 

6028 
1520 DATA C3C3C378F0F0B4C3C3C37BF0F0F0F0F0F0F069 

C3C3C3C33C78F0F0B53F3F3F7A3F3F3F3F3F3F3FE1, 

6453 
1530 DATA C3C3C3C3C3C3963F3F3F3F3F3F3F3F3FF0B4C3 

C3C3C39669C3C3C3C3C3C3C3C3C3C3C7C3C3C3963C, 

6286 
1540 DATA C3C3C33CF0F0B4C3C3C396F0F0F0F0F0F03CC3 

C3C3C3C3C3963CF0F0F0F0F0693D3F3F3F3F3F3FE 1 , 

6889 
1550 DATA C3C3C3C3C3C3963F3F3F3F3F3F3FF0F0F0B4C3 

C3C3C3C3CBC3C3C3C3C3C3C3C3C3C3C7C3C3C3C3C3, 

6963 
1560 DATA C3C3C3C33CF069C3C3C3C33C78F0F0F0B4C3C3 

C3C3C3C3C3C3C33CF0F0F0B4C396F0F03F3FF07AC3, 

7268 
1570 DATA C3C3C3C3C3C3C33D3F3F3F3FF0F0F0F0F069C3 

C3C3C3C3CBC3C3C3C3C3C3C3C3C3C3CBC3C3C3C3C3, 

7289 
1580 DATA C3C3C3C3C33CC3C3C3C3C3C39678F0B469C3C3 

C3C3C3C3C3C3C3C33CF0F0B4C3C378F0F0B4C3E1C3, 

7455 
1590 DATA C3C3C3C3C3C3C3963F3FF0F0F0F0F0F03CC3C3 

C3C3C3C3CBC3C3C3C3C3C3C3C3C3C3CBC3C3C3C3C3, 

7642 
1600 DATA C3C3C3C3C3C7C3C3C3C3C3C3C3963C69C3C3C3 

C3C3C3C3C3C3C3C3C33CF069C3C39678F069C3C3C3, 

7189 
1610 DATA C3C3C3C3C3C3C3C378F0F0F0F0F03C3CC3C3C3 

C3C3C3C3C7C3C3C3C3C3C3C3C3C3C3CBC3C3C3C3C3, 

7692 
1620 DATA C3C3C3C3C3C7C3C3C3C3C3C303C3C3C7C3C3C3 

C3C3C3C3C3C3C3C3C3967869C3C3C396F069C3C3C3, 

7508 

1630 DATA C3C3C3C3C3C3C3C39E3CF0F0B43CC3C3C3C3C3 

C3C3C3C3C7C3C3C3C3C3C3C3C3C38241C3C3C3C3C3, 

7377 
1640 DATA C3C3C3C3C3C3CBC3C3C3C3C3C3C3C3C7C3C3C3 

C3C3C3C3C3C3C3C3C3C396C3C3C3C3C33CC3C3C3C3, 

7632 
1650 DATA C3C3C3C3C3C3C3C3CBC33C3C69C3C3C3C3C3C3 

C3C3C3C3C7C3C3C3C3C3C3C3C3C30000C3C3C3C3C3, 

7062 
1660 DATA C3C3C3C3C3C3CBC3C3C3C3C3C3C3C3C3CBC3C3 

C3C3C3C3C3C3C3C3C3C3CBC3C3C3C3C3C3CBC3C3C3, 

7832 
1670 DATA C3C3C3C3C3C3C3C7C3C3C3C3C7C3C3C3C3C3C3 

C3C3C3C3824 1 C3C3C3C3C3C3C3C30000C3C3C3C3C3 , 

7223 
1680 DATA C3C3C3C3C3C3C7C3C3C3C3C3C3C3C3C3C7C3C3 

C3C3C3C3C3C3C3C3C3C3CBC3C3C3C3C3C3C7C3C3C3, 

7820 



ACCES DIRECT MEMOIRE ECRAN I 139 



1690 DATA C3C3C3C3C3C3C3C7C3C3C3C3CBC3C3C3C3C3C3 

C3C3C3B20000C3C3C3C3C3C3C38200004 1 C3C3C3C3 , 

6772 
1700 DATA C3C3C3C3C3C3C7C3C3C3C3C3C3C3C3C3C3CBC3 

C3C3C3C3C3C3C3C3C3C7C3C3C3C3C3C3C3C3CBC382, 

7759 
1710 DATA O041C3C3C3C3C3C7C3C3C3C3C3C3C3C3C3C3C3 

C3C3C30000004 1 C3C3C3C3C3820000004 i C3C3C3C3 , 

5984 
1720 DATA C3C3C3C3C3C3C7C3C3C3C3C3C3C3C3C3C3CBC3 

C3C3C3C3C3C3C3C3C3CBC3C3C3C3C3C3C3C3C78200, 

7564 
1730 DATA 0000C3C3C3C3C3CBC3C3C3S200C3C3C3C3C3C3 

C3C3C300000000C3C3C3C3C30000000000C3C3C3C3, 

5403 
1740 DATA C3C3C3C3C3820041C3C3C3C3C3C3C3C30000C3 

C3C3C3C3C3C3C34 1 C3CBC3C3C3C3C3C3C3C3C30000 , 

6508 
1750 DATA 00004 1C3C3C3C3CBC3C3C3000000C3C3C3C3C3 

C3C38200000000C3C3C3C3C300000000004 1C3C3C3 , 

4753 
1760 DATA C3C3C3C38200000041C3C3C3C3C3C3C3000000 
C3C3C3C3C3C38200C3CBC3C3C3C3C3C3C3C3820000, 

5728 
1770 DATA 0000004 1C3C3C341C3C38200000000C3C3C3C3 

C3C300000000004 1C3C3C38200000000004 1C3C3C3 , 

3835 
1780 DATA C3C3C3C3000000000041C3C3C3C3C382000000 

4 1 C3C3C3C3C300004 1 8 A4 1 C3C3C3C3C3C3C3000000 , 

4623 
1790 DATA 000000004 1C38200C3C3820000000041C3C3C3 

C382000000000041C3C3C30000000000000041C3C3, 

2990 
1800 DATA C3C3C30000000000000041C3C3C3C300000000 

0041C3C3C3C30000410000C3C3C3C3C3C3C3000000, 

3705 
1810 DATA 0000000041C30000C3C3000000000000C3C3C3 

C382000000000000C3C3C300000000000000004 1 C3 , 

2405 
1820 DATA C3C3000000000000000000C3C3C3C300000000 

0000C3C3C38200004 1 000000C3C3C3C3C382000000 , 

3055 
1830 DATA 0000000000C3000041C300000000000041C3C3 

C30000000000000000C382000000000000000000C3, 

1625 
1840 DATA C3S200000000000000000BC3C3C30000000000 

000000C3C38200000000000000C3C3C38200000000, 

2145 
1850 DATA 000000000082000041 82000000000000004 1C3 
8200000000000000004 1 82000000000000080000C3 , 

1105 
1860 DATA C30000000000000000000041C3820000000000 
0000004 1 C300000000000000004 1 C3C30000000000 | 

1300 
1870 DATA 000000000000000000S20000000000000000C3 

8200000000000000004 1 000000000000000000004 1 , 

585 
1880 DATA 820000000000000000000000C3000000000000 

0000000082000000000000000000C3C30000000000, 

845 
1B90 DATA 000000000B00000000820000000000000000C3 



140 i GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 

000(2000000(300000004 1 0000000000000000000041 , 

455 
1900 DATA 82000000000000000000000041000000000000 

0000000082000000000000000000C3820000000000, 

650 
1910 DATA 00000000000000000000000000000000000041 

000000000000000000000000000000000000000041 , 

130 
1920 DATA 00000000000000000000000041000000000000 

00000000000000000000000000004 1 820000000000 , 

260 
1930 DATA 00000000000000000000000000000000000041 

000000000000000000000000000000000000000000, 

65 
1940 DATA 00000000000000000000000000000000000000 

000000000000000000000000000041000000000000, 

65 
1950 DATA 00000000000000000000000000000000000000 

000000000000000000000000000000000000000000, 


1960 DATA 00000000000000000000000000000000000000 

00000000000000000000000000004 1 000000000000 , 

65 
1970 DATA -fin 
1980 DATA 00000000000000000000000000000000000000 

000000000000000000000000000000000000000000, 


1990 DATA 00000000000000000000000000000000000000 

000000000000000000000000000000000000000000, 


2000 DATA 00000000000000000000050A000000000000Q0 

000000000000000000000000000000000000000000 , 

15 
2010 DATA 00000000000000000000000000000000000000 

000000000000000000000000000000000000000000, 


2020 DATA 0000000B000000000000000F0F0000000000B0 

000000000000000000000000000000000000000000, 

30 
2030 DATA 00000000000000000000000000000000000000 

000000000000000000000000000000000000000000, 


2040 DATA 0000000000000000000000050F0F0000000000 

000000000000000000000000000000000000000000, 

35 
2050 DATA 00000000000000000000000000000000000000 

000000000000000000000000000000000000000000, 


2060 DATA 00000000000000000O0000050F1B3300000000 

000000000000000000000000000000000000000000, 

98 
2070 DATA 00000000000000000000000000000000000000 

000000000000000000000000000000000000000000, 


2080 DATA 000000000000000000000005 1B333300000000 

0000000000000Q0000Q00000000000000000000000, 

134 
2090 DATA 00000000000000000000000000000000000000 

000000000000000000000000000000000000000000, 


2100 DATA 0000000000000000000000001B333322000000 



ACCES DIRECT MEMOIRE ECRAN I 141 



06)016)00000000000000000000006)00000000000000(9 9 

163 
2110 DATA 0000000000000000000Q0000Q0000000000000 

000000000000000000000000000000000000000000 | 


2120 DATA 000000000000000000000000 1B333333000000 

0000000F0F000000000000000000000000000B000Bt 

210 
2130 DATA 00000000000000000000000000000000000000 

000000000000000000000000000000000000000000, 



2140 DATA 00000000000000000000000011333333000000 
00000F0F0F0A000000000000000000000000000000* 
225 

2150 DATA 00000000000000000000000000000000000000 
000000000000000000000000000000000000000000, 



2160 DATA 00000000000000000000000000333333000000 

00 1 1 33330F0F000000000000000000000000000000 , 

302 
2170 DATA 00000000000000000000000000000000000000 

000000000000000000000000000000000000000000, 


2180 DATA 00000000000000000000050F0A00 11 33220000 

00333333270F0A0000000000000000000000000000, 

34*? 
2190 DATA 00000000000000000000000000000000000000 

0000000000000000000000000000000000000003001 


2200 DATA 000000000000000000050F0F0F1B0033220000 

1 133333333270A0000000000000000000000000000 % 

432 
2210 DATA 00000000000000000000000000000000000000 

000000000000000000000000000000000000000000* 


2220 DATA 0000000000000000000F0F1B33332233330000 

3333333333270A0000000000000000000000000000, 

599 
2230 DATA 00000000000000000000000000000000000000 

000000000000000000000000000000000000000000, 



2240 DATA 0000000000000000000F3333333322001 1221 1 

3333333333330F0000000000000000000000000000, 

642 
2250 DATA 00000000000000000000000000000000000000 

000000000000000000000000000000000000000000, 


2260 DATA 0000000000000000050F333333333333002233 

333322001 1330F0000000000000000000000000000 , 

630 
2270 DATA 00000000000000000000000000000000000000 

000000000000000000000000000000000000000000, 


2280 DATA 000000000000000005 1B332233333333222233 

33000000001 1 0F0000000000000000000000000000 i 

523 
2290 DATA 00000000000000000000000000000000000000 

000000000000000000000000000000000000000000, 



2300 DATA 000000000000000005 1B0000 11333333220033 
221 10F0A00000F0000000000000000000000000000 , 
378 



142 I GRAPHISMES EN ASSEMBLEJR SUR AMSTRAD 

2310 DATA 0000000000000000000000001300000000000130 

000000000000000000000000000000000000000000 , 


2320 DATA 00000000000000000500000000003333331122 

0033332700000F0000000000000000000000000000 , 

365 

2330 DATA 00000000000000000000000000000000000000 

00000000000000000000000000000080(3000000000, 


2340 DATA 0000000000000000050000050F22001 1331 122 

3333330F0F00050000000000000000000000000000, 

366 
2350 DATA 00000000000000000000000000000000000000 

000000000000000000000000000000000000000000, 


2360 DATA 00000000000000000500050F1B3333001 10000 
1 1330F0A0000050000000000000000000000000000 , 
269 

2370 DATA 00000000000000000000000000000000000000 

000000000000000000000000000000000000000000, 


23B0 DATA 00000000000000000000051B33333333001 133 

000000000000050000000000000000000000000000, 

309 

2390 DATA 00000000000000000000000000000000000000 

000000000000000000000000000000000000000000, 



2400 DATA 000000000000000000000F3333333333220033 

223333000000000000000000000000000000000000, 

491 
2410 DATA 00000000000000000000000000000000000000 

000000000000000000000000000000000000000000, 



2420 DATA 00000000000000000005 1 B33332200000022 1 1 

22 1 1 330F0000000000000000000000000000000000 , 

336 
2430 DATA 00000000000000000000000000000000000000 

000000000000000000000000000000000000000000, 


2440 DATA 0000000000000000000F1B2200000000003300 

330833270F00000000000000000000000000000000, 

283 
2450 DATA 00000000000000000000000000000000000000 

000000000000000000000000000000000000000000, 



2460 DATA 0000000000000000000F0A00000000002A3322 

33223333270F0A0000000000000000000000000000, 

403 
2470 DATA 00000000000000000000000000000000000000 

000000000000000000000000000000000000000000, 


2480 DATA 0000000000000000000A00000000001551 1 122 

1 1221 133270F000000000000000000000000000000, 

336 
2490 DATA 00000000000000000000000000000000000000 

000000000000000000000000000000000000000000, 


2500 DATA 0000000000000000000A000000000015FB1127 

1 1221 1 330F00000000000000000000000000000000 , 

472 



ACCES DIRECT MEMOIRE ECRAN I 143 



2510 DATA 00000000000000000000000003000000000000 

000000000000000000000000000000000000000000 , 


2520 DATA 0000000000000000000A000000000000FB1 127 

1 12700050000000000000000000000000000000000 * 

378 
2530 DATA 00000000000000000000000000000000000000 

000000000000000000000000000000000000000000* 


2540 DATA 0000000000000000000000000000002A000027 

002700000000000000000000000000000000000000 9 

120 
2550 DATA 00000000000000000000000000000000000000 

000000000000000000000000000000000000000000 9 


2560 DATA 0000000000000000000000000000007FA20033 

0A270A0000000000000000000000Q0000000000000, 

399 
2570 DATA 00000000000000000000000000000000000000 

0000000000000000000000000B0000000000000000, 


2580 DATA 0000000000000000000000000000 1555A20033 

0A330A000000000000000000000000000000000000, 

390 
2590 DATA 00000000000000000000000000000000000000 

000000000000000000000000000000000000000000! 


2600 DATA 0000000000000000000000000000 15FF000033 

0A330F000000000000000000000000000000000000, 

403 
2610 DATA 00000000000000000000000000000000000000 

000000000000000000000000000000000000000000, 


2620 DATA 00000000000000000000000000000051000011 

0A33270000000000000000000000000000000000001 

198 
2630 DATA 00000000000000000000000000000000000000 

000000000000000000000000005 1 B5000000000000 , 

262 

2640 DATA 00000000000000000000000000007F0000001 1 
0A33270000000000000000000Q0000000000000000* 
244 

2650 DATA 00000000000000000000000000000000000000 
00000000000000000000000000F3782A0000000000, 

405 

2660 DATA 00000000000000000000000000007FFB000005 
0A3327000000000000000000000000000000000000* 
483 

2670 DATA 00000000000000000000000000000000000000 
0000000000000000000000005 1 F33CF00000000000 , 

624 

2680 DATA 0000000000000000000Q000000152AF3000005 
00 1 1 0F000000000000000000000000000054A80000 , 

595 

2690 DATA 00000000000000000000000000000000000000 

00000000000000000000000051B63C780000000000, 

443 
2700 DATA 00000000000000000000000000 1555F3000005 

80050F000000000000000000000000000000FC0000, 

626 



144 i GRAPHEMES EN ASSEMBLEUR SUR AMSTRAO 



2710 DATA 54FC0000000BE000000000000000000000000Q 
B0000B000000000000000000F3B63C78A000000B0B, 
1101 

2720 DATA 00000000000000000000000000 15FFA2000005 

00000A000000000000000000000000000000540000 T 

537 
2730 DATA FCAB00000000000000000000000B0000000000 
000000000000000055FFAFFFFFFFFFFFFFFFFFFFAA, 
3400 

2740 DATA 000000000000000000000000000055A200000Q 

00000A00000000000000000000000000FCAB 1 020 1 , 
741 
2750 DATA 74000000000000000000000000000000000000 
0000000000000000FFFFFFAFFF5FFFFFFF5FFF5FAA, 
2786 

2760 DATA 000000000000000000000000007F0000000000 

00000A000000000B0000000B00000034 FC30 1 02030 , 

617 
2770 DATA 20000000000000000000000000000000000000 

00000000000000550FFF5FFFFFFFAF5FFF5FFFFFAA, 

2547 

2780 DATA 000000000000000000000000007FFBA2000000 

00000000000000000000000000000054B830002030, 

936 
2790 DATA 00000B0000000000000000000000000000000Q 

00000000000000FFFFFFFFFF5FFFAFFFFFFFFFFFAA, 

3245 
2800 DATA 000000000000000000000000 152A51A2000000 

00000000000000000000000EBB0000540030301020, 

534 
2810 DATA 0000000000000000000000000000000000000Q 

00000000000505AFFFFFFFFFFFAFFFFFFFFFAFFF0A, 

3095 
2820 DATA 000000000000000000000000 1555FBA2000000 

000000000000000000000000000000A800 1 03000 1 , 

767 
2830 DATA 74AS0000000000000000000000000000000000 

0000000000050FAA00000000FFAFFFFFAFFF5FFFAA, 

2364 
2840 DATA 00000000000000000000000015FFFB00000000 

00000000000000000000000000000000FC00302030, 

907 
2850 DATA 30FC0000000000000000000000000000000000 

000000000005A7AACC030608FFFFFFFFFFFFFFFFAA, 

3073 
2860 DATA 000000000000B000000000000055F300000000 

000000000000000000000000000000FCB830000000, 

812 
2870 DATA 3030A800000000000000000000000000000000 

000000000005A7AACD83CB02FFFFFF5FFFFFFFAF0A, 

2957 
2880 DATA 000000000000000000000000 15AAF300000000 

000000000000000000000000000B0000B830302030, 

794 
2890 DATA 0030A800000000000000000000000000000000 

0000000000052DAAC1CECB08FF5FAFFFFFAFFF0F0A, 

2536 
2900 DATA 00000000000000000000000015550000000000 

000000000000000000000000000000000030300030, 

250 



ACCES DIRECT MEMOIRE ECRAN 1 145 



2910 DATA 2010A300000000000000000000000000000000 
0000000000052DAAC 1 CEC708AFFFFFFF3FFF09D70A , 
2566 

2920 DATA 0000000000000000000000003F55F300000000 

00000000000000000000000000000000000000 1 400 , 

411 
2930 DATA 7400A800000000000000000000000000000000 

000000000005A5AAC0C48908FFF F3FFFFF AE470FAA , 

2702 
2940 DATA 0000000000000000000000002AFF510000E000 

0000000000000000000000000Q0000000000005028, 

498 
2950 DATA 7400A800000000000000000000000000000000 

000000000005A3AA00000000FFEB5FAFFF09475FAA, 

1984 
2960 DATA 0000000000000000000000003FFFF300000000 

000000000000000000000000000000000000005014, 

661 
2970 DATA 10A30000000000000000000000000000000000 

0000000000052FAF5FFFFFFFFFCB0FFFAE098F5FAA, 

2590 
2980 DATA 0000000000000000000000000055A200000000 

0300001300000000000 1 400000000000000000000B4 | 

447 
2990 DATA 10A80000000000000000000000000000000000 

3000000000052FFFFFFFFFFFEFCF870F0903DF0FAA, 

2527 
3000 DATA 0000000000000000000000007F00A200000000 

0B00000000000000000C23000000000000000000F0, 

581 
3010 DATA 00A30000000000000000000000000000000000 

00000000000527FFAFFFFFFFCFC3860C0303CFAF0A, 

2353 
3020 DATA 0000000000000000000000 152AAA0000000000 

0000000000000000002C2300000000000000000000, 

317 
3030 DATA 28A80000000000000000000000000000000000 

00000000000527FFFFAF5FEAC0840C090347CB870A, 

2033 
3040 DATA 0000000000000000000000 1 555FBA200000B00 

000000000000000000 1 428000000000000000000B4 , 

759 
3050 DATA 28A80000000000C0B000000000000000000000 

00000000000525AF5FFF5FC0340C090303CFCB87AA, 

2256 I 

3060 DATA 00000000000000000000001 555 AAA200000000' 

00000000000000000000A8000000000000000000F0, 

846 
3070 DATA 28000000000004CCCBC00000000000000B0000 

00000000000525AFFFFFFFC0C00C0C090303CF8F0A, 

2397 
3080 DATA 0000000000000000000000157FAAA200000000 

00000000000000000000AB00000000000000000050, 

728 
3090 DATA 000000000000044CC4CS800000000000000000 

000000000005ADFFB837FFEAC0C0B40C0303030FAA, 

24B7 
3100 DATA 000000000000000000000000FF5 1 A200000000 

000000000000000000002054000000000000000000, 

614 



146 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 



3110 DATA 3C0000000000044CCCCC8000000000000B0000 
000000000005ADFFB837AFFFFAA50FF00F5AA50FAA, 

2903 
3120 DATA 000000000000000000000B 1555FB0000BB0000 

000000000000000000002020A80000000000000B50, 

669 
3130 DATA B400000000000C0CCCCCC08000000000000000 

0000000000050DFFB837FFFFB6735B73A53CF0AFAA, 

3277 

3140 DATA 0000000000000G00000BB015AAFB0B0000B00B 
0000000000000000B8002020540000000000B00050, 
S54 

3150 DATA A000000000040C0CFBE6CCC000000000000000 
0B000000000535FFB837FFFFB6785B3CA5B6780FAA, 

3312 

3160 DATA 00000000000000000000007rFF00A200000000 
000000000000005400203000000000000000000050, 

788 
3170 DATA 1428000000040C1DFFF3CCC880000000000000 
00000000000585FFB337FF5FB6785B3CA5B6780FAA, 

3180 DATA 00000000000000000000 152AAAA2F300000000 
00000000000000AS0020300000000B000000000000, 

886 
3190 DATA F0280000000C0C3F7FFB44CCC0000000000000 
300B00B000050FAFB8375FFFF3785BB6A5B6F05FAA, 

3481 

3200 DATA 00000000000000000000FF55FF51F30000B000 

000000000000000000 1 03000000000000000000050 , 

1063 
32 1 DATA F03C0000040C 1 D3F3FFBA2CCC8800000000000 

00000000000505FFB337FFFFFBA70FF20F5BA55FAA, 

3641 
3220 DATA 3F3F3F3F3F3F3F3F3F7FFF55FFAAF3F33F3F3F 
3F3F3F3F3F3F3F3F3F3A353F3F3F3F3F3F3F3F3F3F, 

3442 
3230 DATA 3F3F3F3F3F3F3F3F7FFBB73F3F3F3F3F3F3F3F 
3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F2A, 

2871 
3240 DATA 3F3F3F3F3F3F3F3F3FFFFF7FBF3F7BF3B73F3F 
3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F, 

3456 
3250 DATA 3F3F3F3F3F3F3F3F3FFF3F3F3F3F3F3F3F3F3F 
3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F2A, 

2691 
3260 DATA 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F 
3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F, 

2520 
3270 DATA 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F 
3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F2A, 

2499 
3280 DATA 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F 
3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F, 

. ... -. .<.L> 
3290 DATA -fin 



ACGES DIRECT MEMOIRE ECRAN I 147 

Nous allons prendre un exemple simple. L'objet et ses differentes phases 
d'animation, ainsi que les couleurs assoctees, sont resumes sur te schema 
4.2. 



J - m - - m " J' -. X . r . * a t . 




?SaggH o o o o o o o 

*»«E2* o°o o o°o u o Q o 



x«xx*«. '.v.v.v 



tutu 



■H ■ I •■ • ••••• •>••■•••••■• pit! 




X x XX X yxxxSTX 
|«X it X. * * x. X X XX 

x X *. ^ 



•.v.;.v.v. : .%^ 




W////////////A 



X >•* 

kit** 



* v * * * I , 

Ei-£ V.VAV.V.'li 



52S 



SvTxxsk* * ^' f.v, . - , , . , .v.'. ■ v.v.'.v.v. ' .' . : ;. 

>il *7( «, * X X>txl ■ ■■■•■>•■*■*••■■• I • • • • • • - 




o°o° 



^^^^ff-i-i 



*•■*•* 



o°o 5 

I III I IIHUI. I 



'^r.v.v.v/.v.'.v.v.v.v/. 






* KX X,X HX* X * * 

X X X. X X * * X « X :< x 

3. X * *X.X x X-V 
_^.X X. * "» * X X X 

■n k v I*" n i 

3 xv kv.v! 

*x *i.V... 

X X i( <*x 
»XX X X tt 



§ 



8 



'§ 



>a 



o 






^i>//^«^ 



SP 



K^ 



1 



(D 



STYLOS 



0(fond 



«.» x * ^ 
<xx x*c 




© 



* x.x. *; ax *vx ; 

*. v " -- * » V -X V , 



x <xxx »tx X *,;«.>• 



I xx xx x x x-xxxx 

X, X*X XX xw^. x 
* XX XX XXX 



£ 



* xvl.. 

x v xtV.V. 
x xxfc« ._• 



■ 

y Xx<xv 



o o o o o o 






\%ww///w///a 




Schema 4.2 



Les six phases d'animation 
d'un module extraterrestre. 



148 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 



ROUTINE DE RESTITUTION 



La premiere routine, que nous allons realiser, sera celle restituant un 
dessin deja code en memoire (schema 4.3). 



ECRAN 




OBJET 



r 

ligne 



>K 



*K 



Orne 

ligne 



3™ 
ligne 



►H- 



4™ 
ligne 



Schema 4.3 



Restitution d'objet 



y 



Cornme nous I'avons vu precedemment, elle necessite quelques don- 
nees en entree. II lui faut connattre I'adresse de localisation du dessin en 
memoire, ainsi que sa largeur en octets et sa hauteur en lignes. II lui faut 
egalement I'adresse de I'ecran ou Ton souhaite dessiner I'objet. Ces 
renseignements seront fournis dans les variables systeme respectives, 
BUF, LAR, HAU et ECRAN. Nous avons utilise, a cet effet, une zone laissee 
libre par I'ensemble des routines du livre. Ce sont notamment les memes 
variables que pour les routines suivantes. Le listing assembleur assigne 
done un label a chacune de ces variables grace k la directive EQU (voir 
annexe 5). 

Notre utilisation des registres va etre la suivante : DE va pointer sur 
I'ecran (e'est la destination), HL sur le dessin (e'est I'origine), B sera le 



ACC£S DIRECT MtMOIRE ECRAN I 149 

compteur de lignes. Le travail principal est effectue par une instruction 
LDIR, qui copie LAR octets du buffer dans i'^cran. La routine systeme 
#BC26 est utilis^e pour descendre d'une ligne sur celui-ci. 

La seuie difficulte est liee au fonctionnement de cette demiere routine : 
elle travaille sur HL, alors que nous avons utilise DE pour stocker I'adresse 
Scran. On s'en sort gr^ce £ I'instructioh EX DE,HL qui ^change les contenus 
des registres DE et HL. Puis on appelle #BC26, et on refait un EX DE,HL afin 
de replacer le pointeur buffer dans HL, et ceiui d'ecran dans DE. Le 
programme 4.1 resume tout ceci. 







10; 












20 ;prografflfne de copie d'objet 










30 ;RAM-)Ecran 










40 ^programme 4.1 










50; 








4700 




60 
70 i 


DR6 1*4700 










80 ;ENTREE 


: (ECRAN) adresse du 


coin 


sup. gauche 






90 ; 


(BUF) adresse de 


1 'image 






100 ; 


(LAR) nombre d' octets 


par ligne 






110 ; 


(HAU) nooibre de 


ignes 






120 ; 








459C 




130 BUF: 


EQU »459C 






45A0 




140 ECRAN: 


EQU #45A0 






45A6 




150 LAR: 


EQU 845A6 






45A7 




160 HAU: 
170 ; 


EQU #45A7 






4700 


ED5BA045 


180 


LD DE, (ECRAN) 






4704 


2A9C45 


190 


LD HL, (BUF) 






4707 


3AA745 


200 


LD A, (HAU) 






470A 


47 


210 

220 ; 


LD B,A 




;corapteur de lignes 


470B 


C5 


230 NEWLIN 


PUSH BC 




;sauvegarde coapteur 


470C 


D5 


240 


PUSH OE 




jsauvegarde adresse ligne 


47'ZD 


3AA645 


250 


LD A, (LAR) 






4710 


4F 


260 


LD C,A 






4711 


0600 


270 


LD B,0 




;BC=notiibre d'octets 


4713 


EDB0 


280 


LDIR 




jtransfert image 


4715 


EB 


290 


EX DE,HL 




jsauveqarde pointeur buffer 


4716 


El 


300 


POP HL 




jancien debut ligne 


4717 


CD26BC 


310 


CALL #BC26 




; descend d'une ligne 


471A 


EB 


320 


EX DE,HL 






471B 


CI 


330 


POP BC 






471C 


10ED 


340 


DJNZ NEWLIN 




; ligne suivante 


471E 


C? 


350 


RET 






Pass 2 errors: 


00 









150 l GRAPHEMES EN ASSEMBLEUR SUR AMSTRAD 



ROUTINE DE MEMORISATION 



La seconde routine, qui effectue le travail inverse, est tout aussi simple. 
Le registre DE est utilise pour pointer en memoire (c'est la destination, qui 
va recevoir le codage du dessin) et HL sur I'ecran. De cette fa$on, le travail 
est encore une fois effectue grace a LDIR. Mais #BC26 travaille ici 
directement sur HL et nous n'avons pas besoin d'echanger celui-ci avec DE. 
La routine est presentee dans le programme 4.2 







10; 










20 ;prograiMte de copie d'objet 








30 ;Ecran 


->RAfl 








40 ; programme 4.2 








50 j 






4730 




60 
70 ; 


QR6 #4730 








80 ; ENTREE: (ECRAN) adresse du coin 


sup. gauche 






90 ; 


(BUF) adresse du buffer 






100 ( 


(LAR) nombre d' octets 


par ligne 






110 ; 


(HAU) nombre de ligne 


5 






120 ; 






459C 




130 BUF: 


EOU 8459C 




45A0 




140 ECRAN: 


EQU #45A0 




45A6 




150 LAR: 


EQU »45A6 




45A7 




160 HAU: 
170 ; 


EQU #45A7 




4730 


ED5B9C45 


130 


LD DE,(BUF) 




4734 


2AA045 


190 


LD HL, (ECRAN) 




4737 


3AA745 


200 


LD A, (HAU) 


jnorabre de lignes 


473A 


47 


210 
220 ; 


LD B,A 


jutilise cofnoie coapteur 


473B 


C5 


230 NEWL1N: 


PUSH BC 


jsauve conpteur 


473C 


E5 


240 


PUSH HL 


;sauve add. debut ligne 


473D 


3AA645 


250 


LD A, (LAR) 


jnombre d'octets/ligne 


4740 


4F 


260 


LD C,A 




4741 


0600 


270 


LD B,0 


; transits a BC pour LDIR 


4743 


EDB0 


230 


LDIR 


;trans-fert 


4745 


El 


290 


POP HL 


;recupere debut ligne 


4746 


CD26BC 


300 


CALL #BC26 


jdescend d'une ligne 


4749 


CI 


310 


POP BC 




474A 


10EF 


320 


DJN2 NEWLIN 


; suite dessin 


474C 


ED539C45 


330 


LD (BUF),DE 


;Raj variable buffer 


4750 


C? 


340 


RET 




Pass 2 errors: 


00 







ACCES DIRECT MEMOIRE ECRAN I 151 

Maintenant, il faut mettre les routines en application. Pour cela, nous 
allons utiliser les graphismes definis plus haut, representant un petit 
vaisseau extraterrestre multicolore equipe d'un rayon oscillatoire. Nous 
avons defini les six phases du dessin. Le mouvement de I'objet est ici tres 
simple, mais le principe des phases d'animation peut bien entendu etre 
applique a des mouvements beaucoup plus complexes comme le deplace- 
ment d'un personnage. II faut alors dessiner les differentes phases du 
mouvement, y compris les intervalles entre chaque position clef du 
mouvement. Chaque phase est codee en memoire. Pour la restitution du 
mouvement il suffit d'envoyer successivement a I'ecran chaque phase. 

Le programme 4.3 realise le codage en memoire des six phases de 
mouvement de notre petit module. La routine 4.2 est mise en place en 
memoire. Puis, chaque phase est dessinee sur I'ecran et codee par un appel 
de cette routine. 



10 * ******************** 

20 '** Programme 4.3 *-* 

30 ' ******************** 

40 ' 

50 'dessin d'un objet en plusieurs phases 

60 'et codage de cet objet en memoire 

70 'aux adresses $2fff et suite. 

80 'application de la routine 4.2 

90 ' 

100 MEMORY &2FFF 

110 DEFINT a-z 

120 ad=&4730:lign=200 

130 ctrl=0:READ c*: IF c$="fin" THEN 240 

140 FOR i=l TO LEN<c$) STEP 2 

150 c=VAL("Se"+MID*(c$,i ,2)) 

160 POKE ad,c:ad=ad+l:ctrl=ctrl+c 

170 NEXT: READ teste: IF testeOctrl THEN PRINT"Er 

reur DATA 1 igne"lign: END 
180 lign=lign+10:BOTO 130 
190 ' 

200 DATA ED5B9C452AA0453AA74547C5E53AA645, 1908 
210 DATA 4F0600EDB0E1CD26BCC110EFED539C45, 2147 
220 DATA C9, 201 
230 DATA "fin" 
240 ' 
250 INK 0,0: INK 1,21: INK 2,15:INK 3,10: INK 4,6:1 

NK 5,26 
260 POKE &459C, 5(0: POKE &459D,&30: 'buffer depart 
270 POKE &45A0,Bc0:POKE &45A1 , &C0: ' adresse ecran 

du dessin 
280 POKE &45A6,7: ' largeur en oc 

tets=5 +2 bords vides 
290 POKE &45A7,10:' hauteur en 1 i 

gnes=8 +2 bords vides 
300 FOR phase=l TO 6 
310 buf (phase) =PEEK<&459C> +256*PEEK <&459D> = 'recu 

pere adresse dessin 
320 MODE 
330 READ larg,haut 



152 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 



340 FOR h=l TG haut 

350 FDR 1=1 TO larg 

360 READ colo:PLOT 8+ (1-1 ) *4,396- (h-1 ) *2,colo 

370 NEXT 

3B0 NEXT 

390 ' 

400 CALL 2*4730 

410 NEXT phase: 'dessin sui vant 

420 MODE 2 

430 PRINT "DESSINS CODES EN MEMOIRE DE ";HEX*(bu 

f(l>,4);" a "; HEX* (PEEK (&459C) +256*PEEK (&459D 

>,4> 
440 PRINT: PRINVSauvegarde sur fichier DESSINS " 
450 SAVE"dessins. bin", b, buf (1> ,6*7*10+1: 'nb de p 

hases*! argeur*hauteur+l 
460 'phase 1 
470 DATA 10,8 

480 DATA 0,0,0,10,10,10,10,0,0,0 
490 DATA 0,0,10,10,10,1,1,3,0,0 
500 DATA 10,10,10,1,1,1,1,1,3,3 
510 DATA 10,1,5,5,5,5,5,5,1,3 
520 DATA 10,1,5,5,5,5,5,5,1,3 
530 DATA 10,10,1,1,1,1,1,1,3,3 
540 DATA 0,0,10,1,1,1,1,3,0,0 
550 DATA 0,0,0,10,3,3,3,0,0,0 
560 'phase 2 
570 DATA 10,8 

580 DATA 0,0,0,10,10,10,10,0,0,0 
590 DATA 0,0,10,10,10,1,1,3,0,0 
600 DATA 10,10,10,1,1,1,1,1,3,3 
610 DATA 10,1,9,5,5,5,5,5,1,3 
620 DATA 10,1,9,5,5,5,5,5,1,3 
630 DATA 10,10,1,1,1,1,1,1,3,3 
640 DATA 0,0,10,1,1,1,1,3,0,0 
650 DATA 0,0,0,10,3,3,3,0,0,0 
660 'phase 3 
670 DATA 10,8 

680 DATA 0,0,0,10,10,10,10,0,0,0 
690 DATA 0,0,10,10,10,1,1,3,0,0 
700 DATA 10,10,10,1,1,1,1,1,3,3 
710 DATA 10,1,5,5,9,5,5,5,1,3 
720 DATA 10,1,5,5,9,5,5,5,1,3 
730 DATA 10,10,1,1,1,1,1,1,3,3 
740 DATA 0,0,10,1,1,1,1,3,0,0 
750 DATA 0,0,0,10,3,3,3,0,0,0 
760 'phase 4 
770 DATA 10,8 

780 DATA 0,0,0,10,10,10,10,0,0,0 
790 DATA 0,0,10,10,10,1,1,3,0,0 
800 DATA 10,10,10,1,1,1,1,1,3,3 
810 DATA 10,1,5,5,5,9,5,5,1,3 
820 DATA 10,1,5,5,5,9,5,5,1,3 
830 DATA 10,10,1,1,1,1,1,1,3,3 
840 DATA 0,0,10,1,1,1,1,3,0,0 
850 DATA 0,0,0,10,3,3,3,0,0,0 
860 'phase 5 
870 DATA 10,8 

880 DATA 0,0,0,10,10,10,10,0,0,0 
890 DATA 0,0,10,10,10,1,1,3,0,0 
900 DATA 10,10,10,1,1,1,1,1,3,3 
910 DATA 10,1,5,5,5,5,9,5,1,3 



ACCES DIRECT MEMOIRE ECRAN I 153 



920 DATA 10,1,5 
930 DATA 10, 10, 
940 DATA 0,0,10 
950 DATA 0,0,0, 
960 'phase 6 
970 DATA 10,8 
980 DATA 0,0,0, 
990 DATA 0,0,10 
1000 DATA 10,10 
1010 DATA 10,1, 
1020 DATA 10,1, 
1030 DATA 10,10 
1040 DATA 0,0,1 
1050 DATA 0,0,0 



,5,5,5,9,5,1 ,3 

1,1,1,1,1,1,3,3 

,1,1,1,1,3,0,0 

10, 




10 

20 

30 

40 

50 

60 

70 

80 

90 

100 

110 

120 

130 

140 

150 

160 

170 

180 

190 

200 



' ******************** 

*** Programme 4 -3b ** 

' ******************** 

' creat i an d ' un f i ch i er 
'programme 4 -3b 



dessin d 'animation 



MEMORY &2FFF:M0DE 2 
DEFINT a-z 
lign=240 

ad=&3000:FOR phase=l TO 6 
bu-f (phase) =ad 
ctr 1=0: READ c* 

IF c*« M -Fin" THEN lign=l ign+20: NEXT: BOTO 2330 
POKE ad,0:ad=ad+l 
FOR i=l TO LEN(c$) STEP 2 
c=VAL < "&"+MID* <c$ , i ,2) > 
POKE ad,c:ad=ad+i:ctrl=ctrl+c 
NEXT:P0KE ad,0:ad=ad+l:READ teste 
IF testeOctrl THEN PRINT"Erreur DATA ligne" 
1 i gn : END 
210 LOCATE 1,14:PRINT 1 ign: 1 i gn=l ign+10: BOTO 130 
220 * 

230 'PHASE 1 

240 DATA 0000000000000000000000, 
250 DATA 00000000CE8800B0000000 T 342 
00000045CC0C0000000000 , 285 
0000Q0CE0C48S000000000 , 418 
000Q00CE48782000000000 , 430 
000000CE0CD02000000000 , 458 
000000CE8C482000000000 , 450 
00000045CC0C8000000000 , 413 
, 00000000CC8C8000000000, 472 
330 DATA 00000000 14B00000000000, 196 
340 DATA 00003F0014B00000000000, 259 
0000A2C345CA0000000000, 628 
0000A200CE8C8000000000 , 636 
0000A245CE0C8000Q00000 , 577 
00007865CC488000000000 , 625 
000078648C488C48802800, 812 
00007S648C48CC0CD05000 , 936 



260 

270 
280 
290 
300 
310 
320 



350 
360 
370 
380 
390 
400 



DATA 
DATA 
DATA 
DATA 
DATA 
DATA 
DATA 



DATA 
DATA 
DATA 
DATA 
DATA 
DATA 



"T 



154 i GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 



410 DATA 00007 A64CC0C844CB82000, 814 
420 DATA 00007865CC0C8000000000, 565 
430 DATA 0000F065CE8C8000000000 , 815 
440 DATA 00000045CF8C8000000000, 544 
450 DATA 0000000033330000000000, 102 
460 DATA 000000450C0C8000000000 , 221 
470 DATA 000000CE0C48C000000000 t 482 
480 DATA 000045CC8C48C080000000, 805 
490 DATA 00157EBC3CF0B020000000, 843 
500 DATA 51E7CFCC8C48C0B0000000, 1255 
510 DATA E7CFCC8C0C0C48C0000000 , 1070 
520 DATA E7CECCCC0C0CC0C0000000 , 125 
530 DATA 0002000000000100000000, 3 
540 DATA 1583000000006B02000000, 261 
550 DATA 2F4B020000150F83000000, 271 
560 DATA 0000000000000000000000, 
570 DATA -fin 
580 'PHASE 2 

590 DATA 0000000000000000000000, 
600 DATA 00000000CE880000000000 , 342 
610 DATA 00000045CC0C0000000000 , 285 
620 DATA 000000CE0C488000000000 , 418 
630 DATA 000000CE48782000000000 , 430 
640 DATA 000000CE0CD02000000000 , 458 
650 DATA 000000CE8C482000000000 , 450 
660 DATA 00000045CC0C8000000000 , 413 
670 DATA 00000000CC8C8000000000 , 472 
680 DATA 0000000005830000000000, 136 
690 DATA 0000000005830000000000, 136 
700 DATA 0000000005830000000000, 136 
710 DATA 0000000005830000000000, 136 
720 DATA 0000000005830000000000, 136 
730 DATA 0000000045CA0000000000, 271 
740 DATA 00003F4BCE8C8000000000 , 612 
750 DATA 0000A245CE0C8000000000 , 577 
760 DATA 00007865CC488000000000 , 625 
770 DATA 000078648C488C4SS02800 , 812 
780 DATA 000078648C48CC0CD05000 , 936 
790 DATA 00007A64CC0C844C882000 , 814 
800 DATA 00007865CC0C8000000000 , 565 
810 DATA 0000F065CE8C8000000000 , 815 
820 DATA 00000045CF8C8000000000 , 544 
830 DATA 0000000033330000000000, 102 
840 DATA 003FFC3C78F03000000000, 783 
850 DATA 51E7CFCC8C48C080000000, 1255 
860 DATA E7CFCC8C0C0C48C0000000, 1070 
870 DATA E7CECCCC0C0CC0C0000000 , 1253 
880 DATA 000200143CF0A100000000, 483 
890 DATA 15B300CE0C486B02000000, 551 
900 DATA 2F4B47CC8C1D0F83000000, 712 
910 DATA 0000000000000000000000, 
920 DATA -fin 
930 "PHASE 3 

940 DATA 0000000000000000000000, 
950 DATA 0000000000000000000000 , 
960 DATA 0000000000000000000000, 
970 DATA 0000000000000000000000, 
980 DATA 0000000000000000000000, 
990 DATA 0000000000000000000000, 
1000 DATA 00000000CE880000000000 , 342 
1010 DATA 00000045CC0C0000000000 , 2B5 



ACCES DIRECT MEMOIRE ECRAN t 155 



1020 DATA 000000CE0C488000000000, 418 
1030 DATA 000000CE48782000000000 , 430 
1040 DATA 000000CE0CD02000000000 , 458 
1050 DATA 000000CE8C482000000000 , 450 
1060 DATA 00000045CC0C8000000000, 413 
1070 DATA 00003F00CC8C8000000000 , 535 
1080 DATA 0000A24B45CA0000000000 , 508 
1090 DATA 0000A200CE8C8000000000 , 636 
1100 DATA 0000A245CE0C8000000000 , 577 
1110 DATA 00007865CC48S000000000, 625 
1120 DATA 00007864SC488C48802800, 812 
1130 DATA 00007B648C4SCC0CD05000, 936 
1140 DATA 00007A64CC0C844C882000, 814 
1150 DATA 00007B65CC0C8000000000, 565 
1160 DATA 0000F065CEBC8000000000 , 815 
1170 DATA 003FFC3C78F03000000000 , 783 
1180 DATA 51E7CFCCSC48C080000000, 1255 
1190 DATA E7CFCC8C0C0C48C0000000 , 1070 
1200 DATA E7CECCCC0C0CC0CB000000 , 1253 
1210 DATA 000200003C780 100000000, 183 
1220 DATA 158300003C786B02000000, 441 
1230 DATA 2F4B02450C1D0FS3000000, 380 
1240 DATA 000000CE0C48C000000000 , 482 
1250 DATA 000045CC8C48C080000000, 805 
1260 DATA 0000000000000000000000, 
1270 DATA -fin 
1280 'PHASE 4 

1290 DATA 0000000000000000000000, 
1300 DATA 0000000000000000000000, 
1310 DATA 0000000000000000000000, & 
1320 DATA 0000000000000000000000, 
1330 DATA 0000CE8800000000000000 , 342 
1340 DATA 0045CC0C00000000000000 , 285 
1350 DATA 00CE0C48B0000000000000 , 118 
1360 DATA 00CE487820000000000000 , 430 
1370 DATA 00CE0CD020000000000000 , 458 
13B0 DATA 00CE8C4Q20000000000000 , 450 
1390 DATA 0045CC0C80000000000000, 413 
1400 DATA 0000CC8C80000000000000 , 472 
1410 DATA 0000058300000000000000, 136 
1420 DATA 0000058300000000000000, 136 
1430 DATA 000045CA00000000000000 , 271 
1440 DATA 3F87CE8C80000000000000, 672 
1450 DATA A245CE0C80000000000000 , 577 
1460 DATA 7865CC48C0000000000000, 689 
1470 DATA 78648C488C488028000000 , 812 
1480 DATA 78648C48CC0CD050000000, 936 
1490 DATA 7A64CC0C844C8820000000, 814 
1500 DATA 7865CC0C80M00000000000, 565 
1510 DATA F065CESCS0000000000000, 815 
1520 DATA 003FFC3C78F03000000000 , 783 
1530 DATA 51E7CFCC8C4SC080000000, 1255 
1540 DATA E7CFCCSC0C0C48C0000000, 1070 
1550 DATA E7CECCCC0C0CC0C0000000, 1253 
1560 DATA 00023C7800000 100000000, 183 
1570 DATA 15833C7800006B02000000, 441 
1580 DATA 2F4B0C0C80150F83000000, 441 
1590 DATA 00CE0C48C0000000000000 , 482 
1600 DATA 45CC8C48C0800000000000 , 805 
1610 DATA 0000000000000000000000, 
1620 DATA fin 



156 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 



1630 

1640 

1650 

1660 

1670 

1680 

1690 

1700 

1710 

1720 

1730 

1740 

1750 

1760 

1770 

1780 

1790 

1800 

1810 

1820 

1S30 

1840 

1850 

1860 

1870 

1880 

1890 

1900 

1910 

1920 

1930 

1940 

1950 

1960 

1970 

1980 

1990 

2000 

2010 

2020 

2030 

2040 

2050 

2060 

2070 

2080 

2090 

2100 

2110 

2120 

2130 

2140 

2150 

2160 

2170 

2180 

2190 

2200 

2210 

2220 

2230 



'PHASE 5 

DATA 000000000000000000000Q, 
DATA 0000000000000000000000, 
DATA 0000000000000000000000, 
DATA 0000000000000000000000, 
DATA 0000CE8800000000000000, 
DATA 0045CC0C00000000000000, 
DATA 00CE0C4880000000000000, 
DATA 00CE487820000000000000, 
DATA 00CE0CD020000000000000, 
DATA 00CESC4320000000000000 
0045CC0C80000000000000 
0000CC8C80000000000000 



DATA 0045CC0C80000000000000, 

DATA 0000CC8C80000000000000, 

DATA 0000058300000000000000 , 

DATA 3F00058300000000000000, 

DATA A24B45CA00000000000000, 

DATA A200CE8CB0000000000000, 

DATA A245CE0C80000000000000, 

DATA 7865CC4880000000000000, 

DATA 78648C488C488028000000, 
78648C48CC0CD050000000 , 



DATA 78648C48CC0CD050000000. 

DATA 7A64CC0C844C8820000000 

DATA 7865CC0C80000000000000, 

DATA F065CE8C80000000000000 



/A64CC0C844CB820000000 
7865CC0C80000000000000 
. F065CE8C80000000000000 
DATA 0045CF8C80000000000000 
DATA 0000333300000000000000, 
DATA 003FFC3C7BF03000000000, 
DATA 51E7CFCC8C4SC080000000, 
DATA E7CFCC8C0C0C48C0000000, 
DATA E7CECCCC0C0CC0C0000000, 
DATA 00 1 7FC3C28000 1 00000000 , 
DATA 15830C48C0006B02000000, 
DATA 2FC30648C0954B83000000, 
DATA 0000000000000000000000, 
DATA -fin 
'PHASE 6 

DATA 0000000000000000000000 , 
DATA 0000000000000000000000, 
DATA 0000000000000000000000 

DATA 



DATA 0000CE8B00000000000000 
0045CC0C00000000000000 , 
DATA 00CE0C4880000000000000 
DATA 00CE487B20000000000000 
DATA 00CE0CD020000000000000 

DATA 00HF Fin AR^fTlCTCT (71(71(7* 00 (71(71(7* 0(71 



00CE4B7O20000000000000 

DATA 00CE0CD020000000000000, 

DATA 00CESC4820000000000000, 

DATA 0045CC0C80000000000000 , 

DATA 0000CC8CB0000000000000, 

DATA 000045CA00000000000000, 

DATA 3F4BCEaC80000000000000 , 

aq DATA A245CE0C80000000000000, 

30 DATA 7865CC4880000000000000 , 

40 DATA 78648C488C488028000000 , 

DATA 78648C48CC0CD050000000, 

DATA 7A64CC0C844C8820000000, 

7865CC0C80000000000000 , 

F065CE8C80000000000000 , 

. 0045CF8C80000000000000, 

DATA 0000333300000000000000 1 

DATA 00450C0C800000000O0000, 

DATA 00CE0C48C0000000000000 y 

DATA 45CC8C48C08000000B0000, 



DATA 
DATA 
DATA 
DATA 









342 

285 

418 

430 

458 

450 

413 

472 

136 

199 

508 

636 

577 

625 

812 

936 

814 

565 

815 

544 

102 

783 

1255 

1070 

1253 

376 

537 

867 











342 

285 

413 

430 

458 

450 

413 

472 

271 

612 

577 

625 

812 

936 

814 

363 

815 

544 

102 

221 

482 

805 



ACCES DIRECT MfEMOIRE ECRAN I 157 



2240 
2250 
2260 
2270 
2280 
2290 
2300 
2310 
2320 
2330 
2340 



DATA 
DATA 
DATA 
DATA 
DATA 
DATA 
DATA 
DATA 
DATA 



00 1 57EBC7SF03000000000 , 
51E7CFCC8C48C080000E00 , 



E7CFCCBC0C0C48C0000B00 , 
E7CECCCC0C0CC0C0000000 , 
0002000000000 1 00000000 , 
15B3000000006B02000000 , 
2F4B0200001 50FS3000000 , 
0000000000000000000000 | 
fin 

SAVE"dessinsb",b,bu-f (1) f ad-buf <1)+1 
PRINT "Pret pour exec programme 4.4b" 



743 


1255 


1070 


1253 




261 


291 






10 

20 

30 

40 

50 

60 

70 

80 

90 

100 

110 

120 

130 

140 

150 

160 

170 

180 

190 

200 



******************** 
** Programme 4- 3c ** 
******************** 



creation 
programme 



d ' un f ichier 
4.3c 



dessin d 'animation 



MEMORY &2FFF:M0DE 2 
DEFIMT a-z 

lign=270 

ad=&3000:FOR phase=l TO 6 

bu-f (phase) =ad 

ctrl=0:READ c$ 

IF c*="-fin" THEN 1 ign=lign+20: NEXT: GOTO 230 

POKE ad,0:ad=ad+l 

FOR i=l TO LEN(c$> STEP 2 

c=VAL("&"+MID$<c* l i ,2) ) 

POKE ad,c:ad=ad+l:ctrl=ctrl+c 

NEXT: POKE ad,0: ad=ad+l : READ teste 

IF testeOctrl THEN PRINT"Erreur DATA ligne 
lign:END 
210 LOCATE l,14:lign=lign+10:6OTQ 130 
220 ' 
230 
240 
250 
260 
270 



SAVE"dessinsc",b,buf <1) ,ad-bu-f (1)+1 
PRINT "Pret pour exec programme 4- 4c" 

'phase 1 
DATA 0000000000000000000000000E000000000000 



:30 



^90 



;h0 



10 



330 



;40 



;50 



;60 





DATA 



DATA 



DATA 



DATA 



DATA 



DATA 



DATA 



DATA 



DATA 





000000000000000000000000000000000000001 
00000000000000000000000000000000000000 , 
00000000000000000000000000000000000000, 
00000000000000000000000000000000000000, 
00000000000000000000000000000000000000, 
00000000000000000000000000000000000000, 
00000000000000000000000000000000000000, 
00000000000000000000000000000000000000, 
00000000000000000000000000000000000000 , 



158 i GRAPHEMES EN ASSEMBLEUR SUR AMSTRAD 



370 DATA 00000000000000000000000000003000000000 , 



380 DATA 0000000000000000005151000000000000(2000, 
162 

390 DATA 000000000044000000F3F3A200004400000000, 
7B4 

400 DATA 0000000000CCCC0000A2A2A20044CCB8000000, 
1302 

410 DATA 00000000448BCCCC00A2A2A244CC83CC000000, 

1710 
420 DATA 00000000CC0000CCCCC0C0C4CCS83044830000, 

1736 
430 DATA 0000004438000000CCD0F0C4B8000000CC0000 , 

1392 
440 DATA 00000044000000000040C00000000000440000, 

392 
450 DATA 00000000000000000000000000000000000000, 


460 DATA -fin 
470 "phase 2 
480 DATA 00000000000000000000000000000000000000, 


490 DATA 00000000000000000000000000000000000000, 


500 DATA 00000000000000000000000000000000000000 , 


510 DATA 00000000000000000000000000000000000000, 


520 DATA 00000000000000000000000000000000000000, 



530 DATA 00000000000000000000000000000000000000 , 


540 DATA 00000000000000005100510000000000000000, 

162 
550 DATA 000000000000000051F3F30000000000000000, 

567 
560 DATA 00000000000000005151510000000000000000, 

243 
570 DATA 000000000000000051515100CC000000000000, 

447 

580 DATA 0000000000000B44C8C0C0CCCCCC0000000000, 

1264 
590 DATA 00000000B000CCCCC8F0E0CC00CC8800000000, 

1616 
600 DATA 0000000000CCCC8800C0800000008800000000, 

1000 

610 DATA 00000000 4 4CC0000000000000000CC00000000, 

476 
620 DATA 00000000CC00000000000000000B4400000000, 

272 

630 DATA 00000044880000000000000000004483000000, 
408 

640 DATA 000000CC0000000000000000000000S3000000, 
340 

650 DATA 00000088000000000000000000000083000000, 

272 
660 DATA 00000000000000000000000000000000000000, 


670 DATA -fin 
630 'phase 3 



ACCES DIRECT MEMOIRE ECRAN I 159 



690 DATA 0E00B0B00000000B00000G0000e00000000B00, 


700 DATA 00000000000000A20000A200000000B000000G, 

324 
710 DATA 000000000000005 1A2F3000000B0000G000000, 

486 
720 DATA 000000000000005151510000000000012000000, 

243 
730 DATA 00000000000000515151000000000000000000, 

243 
740 DATA 00000000000044C8C0C0CC0000000000000000, 

856 
750 DATA 000000000044CCC8F0E0CCCC00000000000000, 

1344 

760 DATA 0000000000CC3800C08000CC88000000000000, 
1000 

770 DATA 000B00004488000000000000CC000000000000, 

408 
780 DATA 00000000CC0000000000000044e80000000000 , 

408 
790 DATA 00000044880000000000000000CC0000000000, 

408 
800 DATA 00000044000000000000000000440000000000 , 

136 
8 1 DATA 000000CC000000000000000000449S00000000 , 

408 

820 DATA 00000088000000000000000000008800000000, 
272 

830 DATA 00000088000000000000000000008800000000, 

272 
840 DATA 00000000000000000000000000000000000000 , 


850 DATA 00000000000000000000000000000000000Q00 , 


,860 DATA 0000000Q0000000000000000000000000Q0000 f 


870 DATA 00000000000000000000000000000000000000 

§9 

880 DATA -fin 

890 'phase 4 

900 DATA 00000000000000000000000000000000000000 


910 DATA 00000000000000000000000000000000000000, 


920 DATA 00000000000000000000000000000000000000 9 


930 DATA 00000000000000005100510000000000000000, 

162 
940 DATA 000000000000000031F3F30000000000000000, 

567 

950 DATA 00000000000000005151510000000000000000, 
243 

960 DATA 00000000000000005151510000000000000000, 

243 
970 DATA 0000000000000044C8C0C0CC00B000000B0B0B , 

856 
980 DATA 00000000000044CCC8F0E0CCCC000000000000, 

1344 
990 DATA 000B000000CCCCSS00C0S000CCCC8300000E00, 

1408 



160 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAO 

1000 DATA 030000a044CCS8000000000000CCCC00000000 

, S16 
1010 DATA 00000000CC0000000000000000004483B000E0 

, 408 
1020 DATA 00000044SB0000000E0000000G0000CC000000 

f 433 
1030 DATA 000000CC00000000B000000000000044330000 

, 408 
1040 DATA 000000B8000000000000000000000000880000 

, 272 
1 020 DATA 00000000000000000000000000000000000000 

i 
1 060 DATA 00000000000000000000000000000000000000 

* 

1070 DATA 00000000000000000000000000000000000000 

1 080 DATA 00000000000000000000000000000000000000 

f 

1090 DATA fin 
1100 "phase 5 
1110 DATA 00000000000000000000000000000000000000 

1120 DATA 00000000000000000000000000000000000000 

* 

1 130 DATA 00000000000000000000000000000000000000 

t 
1140 DATA 00000000000000000000000000000000000000 

* 

1 150 DATA 00000B0000000000000000000EBB0000000000 

i 
1 160 DATA 00000000000000000000000000000000000000 

i 
1170 DATA 0000000000000000A2A2000000000000000000 

, 324 
1130 DATA 0000000000000051F3F3000000000000000000 

, 567 
1190 DATA 00000000000000515151000000000000000000 

, 243 
1200 DATA 000000004488005151510000CC000000000000 

, 651 
1210 DATA 000000CCCCCCCCC8C0C0CCCCCCCCB3000E0000 

, 2352 
1220 DATA 0000CCCCS844CCCaF0E0CCCC00CCCC8B0000E0 

, 2432 
1230 DATA 00CCCC0000000000C0B00000000044CC880000 

, 1136 
1240 DATA CCCC0000000000000000000000000044CCSS00 

, 316 
1250 DATA CC000000000000000003000000000000448800 

, 408 
1260 DATA 00000000000000000000000000000000000000 

. 3 
1270 DATA 00000000000000000000000000000000000000 

» 
1280 DATA 00000000000000000000000000000000000000 

1290 DATA 00000000000000000000000000000000000000 

■ 
1300 DATA fin 
1310 'phase 6 
1 320 DATA 0000000000000000000000000000000000000a 



ACCES DIRECT M^MOIRE £CRAN I 161 



133(3 DATA 00000000000000000000000002000000000000 

1340 DATA 0000000000000000000000000000000002BE00 

, 
1 350 DATA 00000000000000000000000000000000000000 

, 
1360 DATA 00000000000000000000000000000000000000 

i 

1370 DATA 00000000000000000000000000000000000000 

, 
1380 DATA 00000000000000000000000000000000000000 

, 
1390 DATA 00000000000000000000000000000000000000 

, 

1400 DATA 00000000000000000000000000000000000000 

, 
1410 DATA 00000000000000000000000000000000000000 

, 
1420 DATA 00000000880000000000000000380000000000 

, 272 

1430 DATA 000000CCCC00000B5100000044CC8300B00000 

, B97 
1440 DATA 0000CCCC44880051F3F30000CC44CCB8000000 

, 1791 
1450 DATA 00CCCC0000CC005151510044880044CC8S0000 

, 1467 
1460 DATA 00CC000000448851515100CC00000044e80000 

, 1059 
1470 DATA 000000000000CCC8C0C0CC8S00000000000B00 

, 1128 
1480 DATA 00000000000044C8F0E0CC0000000000000000 

, 936 
1490 DATA 0000000000000000C080000000000000000000 

, 320 
1500 DATA 00000000000000000000000000000000000000 

, 
1510 DATA fin 



Celle-ci remet automatiquement a jour I'adresse du buffer utilise pour le 
codage du dessin. En clair, lorsque le retour au Basic a lieu, I'adresse BUF 
est placee apres le dernier octet du dessin code. Cela permet d'enchainer 
les codages sans recalculer leur emplacement apres chaque appel. 

Une remarque importante s'impose concernant le codage du dessin. 
Nous voulons depiacer celui-ci sur I'ecran, mettons vers la droite. Si nous 
n'y prenons pas garde, voila ce qui risque de se produire. Une fois le dessin 
mis en place a I'ecran, nous allons le redessiner (eventuellement dans une 
autre phase) un octet h droite. Cela va done laisser une trace a I'ecran. Le 
premier octet de chaque ligne restera en effet a I'endroit precedent. Si nous 
deplagons Tobjet vers la gauche, e'est le dernier octet de chaque ligne qui 
va rester a la droite de la nouvelle position. Pour ce probleme, il y a deux 
remedes. Le premier est d'effacer I'ecran la ou se trouvait I'objet precedem- 
ment, avant de le dessiner a son nouve! emplacement. Cette solution un 
peu rudimentaire a un inconvenient : elle provoque un clignotement du 
dessin lors de ses mouvements. 



162 l GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 

La deuxieme solution consiste a integrer un bord vide au dessin lors de 
son codage. Ainsi, le premier et le dernier octet de chaque ligne sont de la 
couleur du fond, il n'y a done aucun scrupule a avoir. Par contre, ceci 
augmente la tailie du codage. Mais la facilite de traitement qui en resulte 
vaut ce petit sacrifice. Cela ne complique aucunement le dessin prelimi- 
naire avant codage. II suffit simpiement de dessiner I'objet sur un ecran 
vide, et de coder ce qui se situe autour de lui. C'est ('explication d'une des 
particulates du programme 4.3. 

En effet, alors que le dessin occupe 5 octets de large et 8 lignes, on place 
dans les variables LAR et HAU les valeurs 7 et 10. II s'agit simpiement de 
coder un octet en plus dans chaque direction autour de I'objet. Celui-ci est 
dessine par PLOT en haut a gauche de I'ecran, en laissant une ligne vide au- 
dessus et deux points a gauche (un octet contient deux points). Une fois 
toutes les phases codees en memoire, le programme ecrit celles-ci dans un 
fichier binaire DESSINS. 

Le programme 4.4. recupSre ce fichier et affiche les phases Tune apres 
I'autre, grace a la seconde routine. 



20 '** Programme 4.4 ** 

30 ' ******************** 

40 * 

50 'dessin d'un abjet en plusieurs phases 

60 'd 'apres le codage effectue par progranii7ke 4.3 

70 'aux adresses ^2-f-ff et suite. 

83 'application de la routine 4.1 

90 ' 

100 MEMORY &2FFF 

110 ad=&4700slign=200 

120 ctrl=B:READ c$: IF ct= tt fin" THEN 220 

130 FOR i=l TO LEN(c#) STEP 2 

140 c=VAL("2< ,, +MID$(c$,i ,2)) 

150 POKE ad,c:ad=ad+l:ctrl=ctrl+c 

160 NEXTiREAD teste: IF testeOctrl THEN PRINT"Er 

reur DATA ligne"l ign: END 
170 lign=lign+10:GOTO 120 
180 ' 

190 DATA ED5BA0452A9C453AA74547C5D53AA645, 1892 
200 DATA 4FB60BEDB0EBE1CD26BCEBC110EDC9, 2271 
210 DATA "fin" 
220 ' 

230 MODE 
240 LOAD"image.bin" ,&C00B: 'chargeraent du decor, 

optionnei 
250 FOR 1=0 TO 15 



ACCES DIRECT MtMOIRE ECRAN I 163 

260 INK I, ABC(MID$C"ACLFSPGJOCJXSDZQ" ,1+1,1) ) -&5 
270 'INK I,ASC(MID^("AriTQSVSJRCJX3RYQ" ,1 + 1,1) ) -6 

5 pour monochrome 
280 NEXT 
290 ecr=63120 
300 POKE &45A6,7: ' largeur en oc 

tets 
310 POKE &45A7,10:' hauteur en n 

ombre de lignes 
320 LOAD"dessins",&3000 
330 FOR phase=l TO 6 

340 bu-f (phase) =&3000+ (phase-1 ) * (7*10) 
350 NEXT 
360 * 

370 FOR phase=l TO 6 
3S0 POKE &459C, bu-f (phase) -256*INT (bu-f (phase) /256 

):POKE &459D,INT(buf (phase) /256) 
390 ecr=ecr+l;PDKE &45A0,ecr-236*INT (ecr/256) : PD 

KE &45Al,INT<ecr/256) 
400 CALL &4700:CALL &4700 
410 FOR i=l TO 70: NEXT 
420 NEXT 
430 SOTO 370 



Vous remarquerez la boucle d'attente de la ligne 390, et le double appel 
de la routine en 380. Cela n'est destine qu'£ obtenir un deplacement souple 
de I'objet pour rendre le mouvement agreable a I'ceil. La suppression de la 
boucle d'attente entra?ne un mouvement saccad6, les affichages se 
succedant plus rapidement que I'ceil ne les fixe. 



RE MARQUES 



Les deux routines de ce chapitre sont utiles a plus d'un titre. Elles 
constituent en quelque sorte le noyau de ('ensemble des routines du livre. 
Bien qu'eiles soient courtes et simples, elles procurent des fonctionnalites 
extremement pratiques : 

- elles peuvent trailer des objets de taille quelconque ; 

- elles travaillent a partir de donnees elementaires 16 bits, faciles d traiter 
par un programme exterieur; 

- elies produisent un resultat brut ind6pendant de toute autre considera- 
tion tide au programme appelant. 

En revanche, elles ont deux defauts : elles n'autorisent pas de mouve- 
ment d'objet sur un fond de decor, et ne traitent que des objets codes 



164 ! GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 

simplement, parfois tres encombrants. Nous allons remedier a ces deux 
problemes dans les chapitres suivants. 

Les programmes 4.3b et 4.4b ont respectivement les memes fonctions 
que les 4.3 et 4.4, mais ici I'objet anime est un robot. Sa particularity est de 
posseder six phases d'animation plus complexes que pour le module, 
permettant ainsi de constater I'efficacite du principe. Les programmes 4.3c 
et 4.4c ont egalement les memes fonctions, mais le personnage anime est 
une puce extraterrestre. Vous pouvez sans probleme creer 4.3c et 4.4c a 
partir de 4.3b et 4.4b. Seuls les DATA des dessins et quelques POKE sont 
modifies. 



Modifications de 4.4 pour 4.3b 

290 ecr=59104 

300 POKE &45A&,21: ' largeur en □ 

ctets 
310 POKE &45A7,19:' hauteur en n 

ombre de lignes 
LOAD"dessinsC" ,Sc3000 
40 buf (phase) =&3000+-(phase-l> *(21*19) 



-THj 



-_■ 



Modifications de 4.4 pour 4.4b 



290 ecr=64768 

300 POKE &45A6,13:' largeur en o 

ctets 
10 POKE &45A7,33: ' hauteur en n 

ombre de lignes 
20 L0AD"dessin5B" ,&3000 
40 buf (phase) =&3000+(phase-l)*( 13*33) 



~r 



Les fichiers "dessins", "dessinsb" et "dessinsc" crees par les pro- 
grammes 4.3 sont utilises dans les chapitres suivants afin de vous epargner 
de longues listes de DATA. Ne perdez done pas la cassette ou disquette ou 
vous les installez. 



CODAGE DES OBJETS c 

GRAPHIQUES 3 



i 



1S6 l GRAPHEMES EN ASSEMBLEUR SUR AMSTRAD 

POURQUOI COMPACTER ? 



Nous avons realise dans le chapitre precedent deux routines nous 
permettant de traiter facilement des objets. Elles permettent de gerer la 
plupart des petits objets sans difficulty ni inconvenient. II en va autrement 
si les objets a dessiner sont de grande taille. Un simple dessin de 40 points 
sur 20 lignes va necessiter 22x22= 484 octets (y compris les bords vides). 
Nous pouvons probablement reduire cet encombrement. 

La solution passe par un compacteur graphique. Si nous trouvons un 
moyen de reduire I'encombrement du dessin en le codant differemment, 
nous aurons plus de place pour les dessins. 

II existe de nombreuses fagons de reduire un dessin. La plus simple est 
de realiser un interpreteur graphique, et de transformer le dessin en 
programme. Par exemple, un grand rectangle vide sera une suite de 
commandes du type "PLOT premier coin, DRAW deuxieme coin, DRAW 
troisieme coin, DRAW quatrieme coin, DRAW premier coin, REMPLIT point 
interieur". Mais ce procede a un gros inconvenient : sa lenteur. Par la 
meme, il restreint son interet aux dessins geometriques et non animes. 

Une autre solution est celle du compacteur graphique. Nous allons le 
realiser. 



METHODES DE COMPACTAGE 



II faut definir un principe de codage. Nous allons compacter chaque ligne 
de dessin avant de la memoriser. Lors de la restitution, nous decompac- 
terons avant de dessiner sur I'ecran. 

Une fagon simple de compacter est la suivante : au lieu de stocker 
chaque octet de la ligne, on stocke les parcelles d'octets identiques sous la 
forme "Nombre d'octets a dessiner, Contenu de ces octets". Ainsi, si la 
ligne comporte dix octets a $00 de suite, ils deviendront deux octets : $0A. 
et $00, soit dix et zero. Si le dessin comporte alors de nombreuses lignes 
integrant elles-memes de nombreuses suites d'octets identiques, le 
compactage sera extremement avantageux. Par contre, il en sera autre- 
ment si chaque ligne ne contient que des octets differents ou non 
regroupes : dans ce cas, le nouvau codage est deux fois plus encombrant 
que I'ancien ! II faut done etre prudent : le compactage n'est pas universel- 

lement interessant. 

Remarquez egalement que nous pourrions compacter par colonne au 
lieu de nous interesser aux lignes : les problemes et les avantages sont 
exactement les m£mes. 

La solution, telle que nous I'avons envisagee, limite I'interet du compac- 
tage aux dessins formes de nombreuses lignes contenant des octets 



CODAGE OBJETS GRAPHiQUES I 167 

groupes. Nous pouvons, moyennant une legere consommation supple- 
mentaire, en elargir le champ. Pour cela, il suffit d'ajouter un octet 
preliminaire a chaque ligne. Get octet perrnettra de representer deux cas : 
ou bien le compactage n'etait pas interessant, auquel cas la ligne n'est pas 
codee et doit etre recopiee telle quelle a I'ecran, ou bien ii taut ia 
decompacter lors de I'affichage car le compactage etait economique. 

Cela raffine le procede. II se peut qu'une certaine zone du dessin possede 
de nombreux groupes d'octets, et que le reste du dessin soit anarchique. 
Dans ce cas, la distinction au niveau de chaque ligne nous perrnettra de 
gagner tout de meme des octets. 

Nous venons de definir le format d'un objet compacte en memoire. En 
effet, nous savons que : 

- si le premier octet a une certaine valeur, la ligne n'est pas compactee. II a 
done LAR octets a recopier simplement (par exemple par LDIR comme au 
chapitre precedent) ; 

- si, par contre, il a une autre valeur donnee, ia ligne est compactee. Au 
lieu de copier les octets un par un, nous devons lire un certain nombre de 
couples d'octets et les transformer a I'ecran selon leur signification. 

En ce qui concerne la valeur de cet octet preliminaire, vous remarquez 
que nous n'avons besoin que de deux valeurs. Pourquoi ne pas utiliser un 
simple bit, signifiant alors "compacte" s'il est a 1 et "non compacte" s'il est 
a zero. Dans ce cas, il nous reste 7 bits de I'octet. Nous pouvons alors en 
profiter pour simplifier le decompactage des lignes ou leur copie non 
compactee. En effet, si la ligne est compactee, nous avons un nombre 
inconnu de couples d'octets a lire. Ce nombre depend de la ligne 
compactee et du nombre de groupes d'octets s'y trouvant. II est possible de 
coder ce nombre de couples dans I'octet preliminaire, dans les 7 bits 
restants. Cela nous autorise a placer jusqu'a 127 couples d'octets dans une 
ligne, ce qui n'aura jamais lieu : au pire, la ligne occupe toute une ligne 
d'ecran, ce qui represente 80 octets au maximum. Nous aurions alors 80 
couples (et encore ne s'agit-il que d'une vue de I'esprit : dans un tel cas, la 
ligne ne serait pas compactee !). 

Par soucis d'homogeneite, nous pouvons placer LAR dans I'octet 
preliminaire si la ligne n'est pas compactee. Cela est presque inutile 
puisque nous connaissons a priori LAR. Le dessin sera done memorise 
sous la forme suivante : 

■ 
□ Pour chaque ligne : 

- si bit 7 du premier octet=1, ligne compactee : la valeur representee 
par les 7 bits de droite est le nombre de couples d'octets a decompacter. 
Une fois ces couples sautes, la ligne suivante commence ; 

- sinon bit7=0, il s'agit d'une ligne non compactee. Copier les LAR 
octets suivant directement sur I'ecran. Apres eux commence la ligne 
suivante. 

D Ligne suivante. 



168 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 

ALGORITHME DE COMPACTAGE 

li nous faut maintenant definir la premiere routine plus precisement. Elle 
se chargera de compacter un dessin de I'ecran en mSmoire. En entree, elle 
doit posseder les memes renseignements que son homologue du chapitre 
precedent : BUF, adresse de destination de I'objet, LAR, nombre d'octets 
de largeur, HAU, nombre de lignes, et ECRAN, adresse du coin en haut a 
gauche du dessin sur l'6cran. En sortie, BUF sera positionne sur le premier 
octet suivant I'objet. 

L'algorithme est le suivant : 

□ initialiser le pointeur de destination de I'objet ; 

□ initialiser le pointeur du dessin original ; 

□ pour HAU lignes : 

• positionner le bit 7 de I'octet preliminaire actuel (par defaut, la 

ligne est compactee) ; 

• positionner le pointeur destination sur le deuxieme octet (c'est-a- 
dire le d6but des couples de donnees, immediatement apres 
I'octet preliminaire) ; 

• compteur de couples=0 ; 

• compteur d'encombrement=0 ; 

• octet de reference= premier octet du dessin ; 

• compteur de repetition=0. 

• pour LAR octets : 

- incrementer le compteur d'encombrement. 

- si I'octet ecran =octet de reference : 

incrementer le compteur de repetition. 

- passer a I'octet ecran suivant de la ligne ; 

- si cet octet differe d'octet de reference : 

stocker compteur repetition dans la destination ; 

stocker octet reference derriere ; 

avancer le pointeur destination ; 

octet reference=nouvel octet ecran ; 

incrementer le compteur de lectures ; 

compteur de repetition=0 ; 

incrementer le compteur d'encombrement. 

• fin boucle sur LAR. 

• mettre compteur de lectures dans les sept bits de droite de I'octet 
preliminaire. 

• se replacer sur I'octet preliminaire en destination sans perdre la 
valeur finale de la boucle LAR, qui represente le debut de la ligne 
suivante en destination si la ligne actuelle est compactee. 

• si compteur encombrement> = LAR : 

- enlever le bit7 de I'octet preliminaire, la ligne ne doit pas etre 

compactee ; 

- mettre LAR dans les sept autres bits de cet octet ; 

- copier directement la ligne ecran dans la destination (LAR 
octets) ; 

- remettre a jour le pointeur destination : ancien+LAR+1 ; 



CODAGE OBJETS GRAPHIOUES I 169 

• sinon, la destination est deja au point, il faut juste remettre a jour 
le pointeur destination. 

• passer § la ligne suivante de I'ecran. 
□ fin boucle sur HAU. 

D fin de la routine, remettre a jour BUF d'apres la valeur actuelle du 
pointeur destination. 

Nous devons egalement faire une liste des variables n6cessaires : 

- BUFAC sera notre pointeur destination. Au depart, il prendra la valeur de 
BUF et nous travaillerons avec BUFAC ; remettons BUF a jour apres ie 
traitement de chaque ligne. C'est une variable 16 bits. 

- BUF est le pointeur initial de destination. Comme BUFAC, il s'agit d'une 
variable 16 bits. 

- LIGNE va etre I'equivalent de BUFAC pour I'ecran : nous y rangerons 
I'adresse ecran de la ligne en cours de traitement. 

- ECRAN, enfin, (dernfere variable 16 bits) est la donn6e de depart 
indiquant I'adresse du dessin. 

Nous aurons aussi comme variables 8 bits : 

- COUNT, compteur d'encombrement ; 

- REPEAT, compteur de repetition ; 

- OCTREF, octet de r6f6rence ; 

- LECTUR, compteur de lecture ; 

- LAR et HAU, donnees initiales largeur et hauteur du dessin. 

Notons I'usage qui sera fait de certains registres lors des travaux : IX 
pointe sur COUNT, ce qui permet d'acc^der aux autres variables simple- 
ment par adressage index6. Pour incr6menter le compteur de lecture, on 
utilisera par exempie une simple instruction "INC (IX+3)" au lieu de la 
sequence classique "LD A, (LECTUR)"-"INC A"-"LD (LECTUR),A" qui est 
plus lente, encombrante, et nous ferait perdre le contenu du registre A. DE 
sera le pointeur ecran de travail sur la ligne en cours de traitement. BC sera 
utilise a chaque fois que Ton aura besoin d'un compteur. L'ancien BC sera 
bien entendu sauvegardS auparavant s'il ne doit pas §tre perdu. 

Le programme 5.1 est la traduction en LM de I'algorithme. Largement 
comments, il vous suffira de le suivre comparativement a I'algorithme pour 
comprendre son fonctionnement (listing assembleur 5.1). 



10; 

20 ;prograone de coopactage graphique 
30 ;Entrees:variables ECRAN, HAU, LAR et BUF 
40 ;Coapacte l'inage designee dans le buffer 
50 ;tprografifiie 5.1) 
68; 
4500 70 ORB #4580 

81; 



170 I GRAPHEMES EN ASSEMBLEUR SUR AMSTRAD 



4500 


2AA045 


90 ENTREE: 


LD 


HL, (ECRAN) 


jadresse du de55in sur ecran 


4503 


229E45 


100 
110 ; 


LD 


(LIGNE) ,HL 


;debut de ligne 






120 ;raise en place boucle pour une 


ligne ecran 






130 j 








4506 


3AA745 


140 


LD 


A, (HAU) 




4509 


47 


150 


LJ) 


B,A 


;nombre de lignes 


450A 


DD21A245 


160 
170 ; 


LD 


IX, COUNT 


;debut table variables 8 bit 


450E 


C5 


180 NEWLIN: 


PUSHBC 


;sauve coapteur lignes 


45BF 


2A9C45 


190 


LD 


HL, (BUR 




4512 


23 


200 


INC 


HL 


;HL pointe destination des 
donnees 


4513 


AF 


210 


XOR 


A 




4514 


32A345 


220 


LD 


(REPEAT), A 


jcompteur REPEAT 


4517 


32A545 


230 


LD 


(LECTUR),A 


;corapteur lectures 


451A 


32A245 


240 


LD 


(COUNT) ,A 


jcompteur COUNT 


451D 


ED5B9E45 


250 


LD 


DE,(LIBNE) 




4521 


1A 


260 


LD 


A,(DE) 


;ier octet de la ligne/dessi 


4522 


32A445 


270 


LD 


(QCTREF),A 


;=octet de re-ference 


4525 


3AA645 


280 


LD 


A,(LAR) 




4528 


47 


290 
300 ; 


LD 


B,A 


jnorabre d 'octets sur ligne 






310 ; etude de 1 


octet actuel 








320 \ 








4529 




330 NEWOCT 








4529 


1A 


340 


LD 


A, (DE) 


; octet ecran 


452A 


DDBE02 


350 


CP 


(IX+2) 


;=octet re-ference ? 


452D 


C23345 


360 


JP 


NZ, OCTSUI 


;non:octet suivant. 


4530 


DD3401 


370 


INC 


(IX+1) 


;repeat=repeat+l 


4533 


13 


380 OCTSUI 


INC 


DE 


;avance dans ligne ecran 


4534 


7B 


390 


LD 


A,B 


;compteur octets 


4535 


FE01 


400 


CP 


1 


; dernier octet ? 


4537 


CA4145 


410 


JP 


z,compac 


;oui:coffipacter 


453A 


1A 


420 


LD 


ft, IDE) 


jprend 1' octet dessin 


453B 


DDBE02 


430 


CP 


(IX+2) 


;=octet re-f ? 


453E 


CA5C45 


440 
450 ; 


JP 


Z,FINOCT 


;ouiscontinuer boucle 






460 jcoapactage des octets 








470 ; 








4541 


3AA345 


480 COMPAC 


: LD 


A, (REPEAT) 


; repeat 


4544 


•77 


490 


LD 


(HL) |A 


5place dans buffer 


4545 


23 


500 


INC 


HL 


;avance buffer 


4546 


3AA445 


510 


LD 


ft,(OCTREF) 


; octet ref 


4549 


77 


520 


LD 


(HL),A 


;place dans buffer 


454A 


23 


530 


INC 


HL 


;avance buffer 


454B 


1A 


540 


LD 


A,(DE) 


; octet ecran 


454C 


32A445 


550 


LD 


(octrefi,a 


;nouvelle reference 


454F 


DD3403 


560 


INC 


(IX+3) 


; 1 ectures=l ectures+ 1 



CODAGE OBJETS GRAPHIQUES I 171 



4552 


DD3400 


570 


INC (IX+B) 




4555 


DD3400 


580 


INC (IX+0) 


;count=count+2 


4558 


AF 


590 


XOR A 


;A=0 


4559 


32A345 


600 
610 ; 


LD (REFEAT) ,A 


;repeat=0 


455C 


10CB 


620 FINOCT: 
630 ; 


DJNZ NEWOCT 


;suite etude ligne 






640 ;-f in de la liqne. RAJ compteurs 


et pointeurs 






650 ; 






455E 


229A45 


660 


LD (BUFAC) ,HL 


;sauve valeur fin BUFAC 


4561 


2A9C45 


670 


LD HL, (BUF) 


; debut bufac 


4564 


3AA545 


680 


LD MLEC1UR) 


jnoniire de lectures 


4567 


CBFF 


690 


SET 7, A 


jcompacte, par defaut 


4569 


77 


700 


LD (HL) ,A 


;dans codage de ligne 


456A 


3AA245 


710 


LD A, (COUNT) 


; longueur compactage 


456D 


DDBE04 


720 


CP (IX+4) 


; compare a LAR 


4570 


DA8545 


730 
740 ; 


JP C,FINLIN 


;ok pour compactage 






750 ;ne pa= 


compacter, ce n'est pas 


interressant. 






760 ; 






4573 


3AA645 


770 


LD A, (LAR) 


jnonibre d 'octets 


4576 


77 


730 


LD (HL) ,A 


;b7=0,non campacte. 


4577 


23 


790 


INC HL 




4578 


EB 


800 


EX DE,HL 


;DE pointe datas dans buffer 


4579 


2A9E45 


810 


LD HL, (LIGNE) 


;debut de la Ligne 


457C 


4F 


820 


LD C,A 




457D 


0600 


830 


LD B,0 


;BC=LAR=nombre d 'octets 


457F 


EDB0 


840 


LDIR 


;transfert dans buffer 


4581 


ED539A45 


m 

860 j 


LD (BUFAC), DE 


;fin de ligne en buffer 


4585 


2A9A45 


870 FINLIN. 


LD HL, (BUFAC) 




4588 


229C45 


880 


LD (BUF) ,HL 


;RAJ pointeur buffer 


458B 


2A9E45 


890 


LD HL, (LIGNE) 




458E 


CD26BC 


900 


CALL #BC26 


; passe ligne plus bas 


4591 


229E45 


910 


LD (LI8NE),HL 




4594 


CI 


920 


POP BC 


jrecupere campteur lignes 


4595 


05 


930 


DEC B 


;NEWLIN est trop elaigne pour 
djnz 


4596 


C20E45 


940 


JP NZ,NEWLIN 


; suite dessin 


4599 


C9 


950 
960 ; 


RET 








970 ;variables 








980 ; 






459A 


0000 


990 BUFAC: 


DEFW 




459C 


0000 


1000 BUF: 


DEFW0 




459E 


6000 


1010 LIGNE: 


DEFW 




45A0 


(3000 


1020 ECRAN: 


DEFW 




45A2 


00 


1030 COUNT: 


DEFB 




45A3 


E0 


1040 REPEAT 


DEFB 





172 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 

45A4 00 1050 OCTREF: DEFB 

45A5 00 1060 LECTUR: DEFB 

45A6 00 1070 LAR: DEFB 

45A7 00 1080 HAU: DEFB 

Pass 2 errors: 00 



Le programme Basic 5.1 met en application la routine. 



10 ' ******************** 
20 *** Programme 3-1 ** 
30 ' ******************** 

40 ' 

50 'cornpactage d'un objet graphi que 

60 'programme 5.1 

70 ' 

B0 MEMORY 8c2FFF 

90 DEFINT a-z 

100 ad=&4500:lign=200 

110 ctrl=0:READ c$: IF c$="fin" THEN 300 

120 FOR i=l TO LEN(c$) STEP 2 

130 c=VALC , St"+MID*(c*,i ,2) > 

140 POKE ad,c:ad=ad+l:ctrl=ctrl+c 

150 NEXT:READ teste: IF testeOctrl THEN PRINT"Er 

reur DATA 1 igne"lign:END 
160 lign=lign+10:GOTO 110 
170 ' 

1B0 DATA 2AA045229E453AA74547DD21A245C52A, 1621 
190 DATA 9C4523AF32A34532A54532A245ED5B9E, 1768 
200 DATA 451A32A4453AA645471ADDBE02C23345, 1495 
210 DATA DD34011378FE01CA41451ADDBE02CA5C, 1737 
220 DATA 453AA34577233AA44577231A32A445DD, 1488 
230 DATA 3403DD3400DD3400AF32A34510CB229A, 1465 
240 DATA 452A9C453AA545CBFF773AA245DDBE04, 1909 
250 DATA DA85453AA6457723EB2A9E454F0600ED, 1693 
260 DATA B0ED539A452A9A45229C452A9E45CD26, 1755 
270 DATA BC229E45C105C20E45C9, 1125 
280 DATA "fin" 
290 ' 
300 MODE 0: INK 0,0: INK 1,10: INK 2, 15: INK 3,20: IN 

K 4,17:INK 5,26 
310 READ larg,haut 
320 FOR h=l TO haut 
330 FOR 1=1 TO larg 

340 READ colo:PLOT 8+Q-l) *4,396- (h-l)*2,colo 
350 NEXT 
360 NEXT 
370 ' 

3B0 DATA 24,26 
390 DATA 0,0,0,0,0,0,0,0,0,0,0,1,1,2,2,0,0,0,0,0 

,0,0,0,0 
400 DATA 0,0,0,0,0,0,0,0,0,0,1,1,2,2,2,2,0,0,0,0 

,0,0,0,0 



CODAGE OBJETS GRAPHIQUES i 173 



410 DATA 0,0,13,0,0,0,0,0,0,1,1,2,2,2,2,2,2,0,(2,0 

,0,0,0,0 
420 DATA 0,0,0,0,0,0,0,0,1,1,1,2,2,2,2,2,2,0,0,0 

,0,0,0,0 
430 DATA 0,0,0,0,0,0,0,0,1,1,1,2,2,2,2,2,2,2,0,0 

,0,0,0,0 
440 DATA 0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,2,2,2,0,0 

,0,0,0,0 
450 DATA 0,0,0,0,0,0,0,1,1,1,2,2,2,2,2,2,2,2,2,0 

,0,0,0,0 
460 DATA 0,0,0,0,0,0,0,1,1,1,2,2,2,2,2,2,2,2,2,0 

,0,0,0,0 
470 DATA 0,0,0,0,0,0,1,1,1,1,2,2,2,2,2,2,2,2,2,0 

480 DATA 0,0,0,0,3,3,1,1,1,1,2,2,2,2,2,2,2,2,2,3 

,0,0,0,0 
490 DATA 0,0,3,3,3,3,1,1,1,1,2,2,2,2,2,2,2,2,2,3 

,3,3,0,0 
500 DATA 0,3,3,3,4,4,1,1,1,1,2,2,2,2,2,2,2,2,2,4 

,4,3,3,0 
510 DATA 3,3,3,4,4,0,1,1,1,2,2,2,2,2,2,2,2,2,2,0 

,4,4,3,3 
520 DATA 3,3,4,4,4,0,1,1,1,2,2,2,2,2,2,2,2,2,2,0 

,0,4,4,3 
530 DATA 3,4,4,4,0,0,1,1,1,2,2,2,2,2,2,2,2,2,2,0 

4 4 4 3 
540*DATA 3,3,4,4,4,0,1,1,1,2,2,2,2,2,2,2,2,2,2,0 

4 4 4 3 
550 *DATA 0,3,3,4,4,4,1,1,1,1,2,2,2,2,2,2,2,2,2,4 

,4,4,3,3 
560 DATA 0,3,3,3,4,4,4,1,1,1,2,2,2,2,2,2,2,2,4,4 

4 3 3 3 
570 DATA 0,0,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4 

,3,3,3,0 
580 DATA 0,0,0,0,3,3,3,3,4,4,4,4,4,4,4,4,4,4,3,3 

,3,3,0,0 
590 DATA 0,0,0,0,0,0,3,3,3,3,3,3,3,3,3,3,3,3,3,3 

,3,0,0,0 
600 DATA 0,0,0,0,0,0,0,0,3,3,3,3,3,3,3,3,3,3,0,0 

,0,0,0,0 
610 DATA 0,0,0,0,0,0,0,0,1,1,1,2,2,2,2,2,2,2,0,0 

,0,0,0,0 
620 DATA 0,0,0,0,0,0,0,0,0,1,1,1,2,2,2,2,2,0,0,0 

,0,0,0,0 
630 DATA 0,0,0,0,0,0,0,0,0,1,1,1,2,2,2,2,0,0,0,0 

,0,0,0,0 
640 DATA 0,0,0,0,0,0,0,0,0,0,1,1,1,2,2,0,0,0,0,0 

,0,0,0,0 
650 ' 

660 LOCATE 10,10 
670 hau=28:lar=14 
680 POKE St45A0,0s POKE &45A1 ,&C0: 'parara. adresse 

ecran 
690 POKE Sc45A7,haus * Par am hauteur 

700 POKE £c45A6,lar:' param largeur 

710 POKE &459C,0:POKE &459D ,&30: 'adresse bu-F-fer 

dest. 
720 CALL &4500S ' compactage 

730 PRINT"Une louche pour " : PRINT"continuer " 

740 WHILE INKEY$="":WEND 
750 ' 



174 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 



760 'A-f-fichage bu-ffer compacte 

770 ' 

780 MODE 2:INK 1 ,24: ad=&3000: ' debut buf 

fer 
790 FOR i = l TO hau: ' nombre d 

e lignes 

800 PRINT HEX* (PEEK (AD) ,2) " : " ; : ' octet de 

c adage 
810 IF (PEEK (ad) AND 128) =128 THEN 910:* si oui ,co 

mpacte 
820 ' 

830 'a-f-fichage ligne nan compactee 
840 ' 
850 AD=AD+1:F0R j=l TO PEEK(ad-l):' nombre d' 

octets 
860 PRINT HEX$(PEEK(ad) ,2) "-"; : ad=ad+l 
870 NEXT: PRINT: GOTO 940 
880 ' 

890 'a-f f ichage ligne compactee 
900 ' 
910 ad=ad+l:FOR j = l TO PEEK (ad-1 ) -128 * nombre d' 

octets 
920 PRINT HEX$(PEEK(ad) ,2) "+"HEX* (PEEK(ad+l> ,2) " 

9 

930 ad=ad+2= NEXT: PRINT 

940 NEXT: PRINT "BUFFER COMPACTE : "AD-&3000: PRINT 

"DESSIN ORIGINAL : "hau*lar 
950 SAVE"dessins. cmp " ,b , &3000 , ad-&3000 



II dessine une planete dotee d'un anneau, et compacte cet objet en 
memoire. Les donnees affichees ensuite sont ceiles de I'objet compacte. Le 
premier octet de chaque ligne est I'octet prelirninaire. S' II est superieur a 
$80 compris, la ligne est compactee; sont alors affiches les couples 
d'octets de la ligne. Sinon, tous les octets sont preserves en chaine, la ligne 
n'etant pas compactee. Enfin, le programme sauve I'objet compact^ dans 
le fichier DESSINS.CMP et affiche le gain d'octets obtenu. 



DECOMPACTAGE 



II nous faut maintenant realiser la routine inverse, qui affichera un objet 
d'apres son image compactee en memoire. 

La logique de la procedure est plus simple que la precedente. En effet, au 
debut de la ligne, nous savons si celle-ci est compactee ou non. Ce n'etait 
pas le cas : nous ne savions pas, lors du codage, si le compactage d'une 
ligne etait interessant ou non, et il fallait le tester. Ici, la demarche a suivre 
est tres comprehensible : 

□ initialiser le pointeur ecran (destination) ; 

□ initialiser le pointeur objet (origine) ; 



CODAGE OBJFTS GRAPHIOUES I 175 



□ pour HAU lignes : 

• si bit 7 de I'octet preliminaire =1 : 

— remettre ce bit a zero pour voir le nombre de couples a lire ; 

— pour ce nombre de couples : 

nombre d'octets=1 0f octet du couple ; 
contenu = 2 8 octet du couple ; 
copier N fois le contenu dans I'ecran ; 
passer au couple suivant de I'origine ; 

— tin boucle sur nombre de couples. 

• sinon, bit7=0, la ligne n'est pas compactee : 

— nombre d'octets^ octet preliminaire ; 

— transferer directement ces octets a I'ecran ; 

• passer a la ligne suivante de I'ecran. 

□ fin boucle sur les lignes. 

Le programme assembleur 5.2 est la traduction en langage machine de 
cet algorithme simple. Sa comprehension ne pose pas de probleme 
particulier. 







10; 








20 ; Programme de decompactage 


g rap hi que 






38 ;utilise le -format genere par programme compacteur 






40 ; programme 5.2 








5fl ; 




4600 




60 ORB 14600 

78 ; 

80 ; ENTREES : 

90 ; TABLE = table a afficher 








100 ; ECRAN = debut du Ton doit afficher 






110 ; HAU = nombre de lignes 


du dessin 






120 ; 




4600 


2A4146 


138 ENTREE: LD HI, (ECRAN) 




4603 


224346 


140 LD (LIGNE) ,HL 




4606 


ED5B4546 


158 LD DE, (TABLE) 
160 ; 

178 ;aise en place boucle ligne 
180 ; 




460A 


3A4746 


198 LD A, (HAU) 




460D 


47 


200 LD B,A 
218 ; 


;nombre de lignes 


460E 


C5 


220 Mil: PUSH BC 


;sauve coopteur de lignes 


460F 


1A 


230 LD A,(DE) 




4610 


CB7F 


240 BIT 7,A 


; compactee ? 


4612 


C22046 


258 JP NZ,DEC0h? 
260 ; 


;il faut decompacter la ligne 






270 ; si on arrive ici ler octet <> SS done table non compactee 






288 ; on fait done un transfert direct d'octets 






2?0 : 





176 l GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 



4615 




300 NOCOMP 






46 15 


4F 


310 


LD C,A 


;nombre octets a copier 


4616 


0608 


320 


LD B,0 


; passe dans BC 






330 ;HL pointe deja sur l'ecran 




4618 


13 


340 


INC DE 


;DE sur les donnees de la ligne 


4619 


EB 


350 


EX DE,HL 


;pour utiliser LDIR 


461A 


EDBfl 


360 


LDIR 


;transfert du bloc de donnees 


461C 


EB 


370 


EX DE.HL 


;RAJ DE=pointeur butter 


461D 


C33446 


380 
390 ; 


JP FIKLIN 


;suite bcucle lignes 






400 ; sous 


programme traitant les donnees compactees 






410 ; 






4620 


CBBF 


420 DECOMP 


RES 7,A 


jnombre de couple de valeurs 


4622 


47 


430 


LD B,A 


jcompteur DJNZ 


4623 


13 


440 


INC DE 


;avancer sur bloc de donnees 


4624 




450 B0U2: 






4624 


C5 


460 


PUSH BC 


jsauver compteur lectures 


4625 


1ft 


470 


LD A,(DE) 


j repeat 


4626 


47 


480 


LD B,A 


;dans B pour djnz 


4627 


13 


490 


INC DE 


■ 


4628 


1A 


500 


LD A, (DE) 


;valeur de 1 'octet 


4629 


13 


510 


INC DE 


;avance pour donnee suivante 


462A 


77 


520 COPIE: 


LD (HL) ,A 


;copie sur l'ecran 


462B 


23 


530 


INC HL 




462C 


10FC 


540 


DJNZ COPIE 




462E 


CI 


550 


POP BC 


; recupere ccmpteur lectures 


462F 


10F3 


560 


DJNZ B0U2 


; suite de la ligne 


4631 


C33446 


570 
580 ; 


JP FINLIN 


;-fin du travail 






590 ; sous 


prog de sortie qui recupere les paraaietres et qui rend 






600 ; La main a 1 'appelant 








610 ; 






4634 




620 FINLIN 






4634 


CI 


630 


POP BC 


;recupere corapteur de lignes 


4635 


2A4346 


640 


LD HL,(LIGNE) 


jretour debut ligne ecran 


4638 


CD26BC 


650 


CALL SBC26 


jpasse ligne en dessous 


463B 


224346 


660 


LD (LIGNE) ,HL 




463E 


10CE 


670 
680 ; 


DJNZ B0U1 


; ligne suivante 


4640 


C9 


690 
700 j 


RET 








710 jvariables du programme 








720 ; 






4641 


0008 


730 ECRAN: 


DEFW 




4643 


0000 


740 LISNE: 


DEFW 




4645 


0000 


750 TABLE: 


DEFW 




4647 


00 


760 HAU: 


DEFB 




Pass 2 errors: 


00 







CODAGE OBJETS GRAPHIQUES I 177 

Seule I'instruction "RES 7,A" n'a pas encore ete decrite. Son role est de 
remettre a zero un bit. Ici, il s'agit du bit 7 (le plus a gauche) du registre A. 

Enfin, ultime remarque, vous pouvez constater que la routine utilise tres 
peu de variables systeme. Cela est du a la simplicity de I'algorithme : il y a 
suffisamment peu de donnees a manipuler pour qu'aucun conflit de 
registre ne se pose. 

Le programme Basic 5.2 propose la mise en ceuvre de la routine. II utilise 
le fichier DESSINS.CMP cre§ par le programme 5.1. Ce fichier contient 
I'image compacts de la planete. 



10 ********************* 
20 '** Programme 5.2 ** 
30 ' ******* ************* 

40 ' 

50 'decompactage d'un objet graphique 

60 'programme 5-2 

70 ' 

30 MEMORY &2FFF 

90 ad=&4600:lign=200 

100 ctrl=0:READ c$:IF c$="-fin" THEN 243 

110 FOR i = l TO LEN(cS) STEP 2 

120 c=VAL("Sc"+MIDS(c$,i,2) ) 

130 POKE ad,c:ad=ad+l:ctrl=ctrl+c 

140 NEXT: READ teste: IF testeOctrl THEN PRINT"Er 

reur DATA 1 igne" ligns END 
150 lign=lign+10:GOTO 100 
160 ' 

170 DATA 2A4146224346ED5B45463A474647C51A, 1303 
180 DATA CB7FC220464F060013EBEDB0EBC33446, 1930 
190 DATA CBBF4713C51A47131A13772310FCC110, 1473 
200 DATA F3C33446C12A4346CD26BC22434610CE, 1756 
210 DATA C9, 201 
220 DATA "fin" 
230 ' 
240 ' 

250 MODE 0: MEMORY &2FFF: LOAD"des5ins- emp" ,&3000 
260 hau=28 

270 INK 0,0: INK 1,10: INK 2, 15: INK 3,20: INK 4,7 
2S0 POKE &4645,0:POKE &4646,&30: 'bu-F f er origine 
290 POKE Se4647,hau:' nombre de ligne 

s 
300 i=0:ad=49232:WHILE i<80: ad=ad-l: i=i+l 
310 POKE &4641,ad-256*INT (ad/256): POKE Sc4642,INT 

(ad/256) 



178 I GRAPHEMES EN ASSEMBLEUR SUR AMSTRAD 

320 FOR k=l TO 20: NEXT 

330 CALL &460B: ' af-fichage decom 

pacte 
340 WEND 
350 LOCATE 1,15 



Bien evidemment, la routine 5.2 ainsi rSalisee ne peut traiter que des 
images compactees par la routine 5.1. Une remarque s'impose : son 
efficacite est proportionnelie a la quantity de motifs horizontaux uniformes 
presents dans le dessin. Si celui-ci comporte principalement des motifs 
verticaux, il vaut mieux le coder simplement (avec les routines du chapitre 
4), ou r mieux, r^aliser un compacteur travaillant par colonne piutdt que par 
ligne. Ce n'est pas excessivement compliqu6 si vous avez correctement 
assimile le fonctionnement de ce chapitre : seule la progression sur l'6cran 
change, les principes de codage et de traitement restant valables. Cela 
constitue un excellent exercice que nous vous laisserons, pour une fois, 
affronter, 



DEPLACEMENTS PAR £ 

CALCUL D'ADRESSES ° 



180 I GRAPHEMES EN ASSEMBLEUR SUR AMSTRAD 



GESTION DU JOYSTICK 



Lors des deux chapitres precedents, vous avez pu remarquer que le 
deplacement des objets s'obtenait facilement en modifiant I'adresse de 
localisation sur I'ecran. En I'occurrence, en ajoutant 1, ii se produisait un 
mouvement vers la droite, et vers la gauche pour -1. 

Les deplacements horizontaux sont simples, mais tout change lorsque 
nous nous penchons sur le probleme des rnouvements verticaux. En effet, 
le deplacement d'une ligne vers le haut ou vers le bas n'est pas immediat. 
La structure de la memoire ecran s'oppose a tout calcul simple. Nous allons 
done realiser une routine qui, suivant I'etat du joystick, modifiera correcte- 
ment I'adresse de destination en memoire ecran. 

Exarninons tout d'abord la gestion du joystick. Celle-ci est grandement 
facilitee par la presence d'une routine systeme dont le vecteur est place en 
$BB24 L'appel de cette routine range I'etat du Joystick dans le registre A, 
de la fagon suivante : bit 3 positionne a 1 si action du joueur vers la droite, 
bit 2 si vers la gauche, bit 1 si vers le bas, et bit si vers le haut. Notons 
egalement les bits 4 et 5 restituant de fagon similaire I'etat des deux 
boutons de tir. 

Les combtnaisons de bits sont bien sur possibles : si le mouvement 
choisi est en diagonale vers la gauche en haut, les bits et 2 seront tous 
deux positionnes. On obtient done 16valeurs grace a ces quatre bits, 
provoquant un mouvement bien precis. Le tableau ci-dessous resume ces 
valeurs. 



b3b2b1b0 


Valeur 
DEC/HEX 


Mouvement correspondant 





0/$00 


— 




1 


1/$01 


vers haut 




10 


2/$02 


vers bas 




11 


3/$03 * 


— 




10 


4/$04 


vers gauche 




10 1 


5/$05 


versgauche+haut 


(DIAG1) 


110 


6/$06 


versgauche+bas 


(DIAG2) 


111 


7/$07 * 


vers gauche 




10 


8/$08 


vers droite 




10 1 


9/$09 


vers droite+haut 


(DIAG3) 


10 10 


10/$0A 


vers droite+bas 


(DIAG4) 


10 11 


11/$0B * 


vers droite 




110 


12/$0C * 


— 




110 1 


13/$0D * 


vers haut 




1110 


14/$0E * 


vers bas 




1111 


1 5/SOF * 


— 





DEPLACEMENTS PAR CALCUL O'ADRESSES I 181 

Toutefois, certaines vaieurs ne correspondent k aucune realite physi- 
que : pour produire par exemple la valeur 7, il faudrait placer le manche a 
la fois vers la gauche, le haut et le bas. Les vaieurs ainsi inutiles sont 
marquees d'une etoile dans le tableau. 

II est cependant plus simple de traiter I'etat du joystick par I'intermediaire 
d'une table contenant ces 16 vaieurs. En effet, on peut placer dans une 
table une adresse de routine associee a chaque code joystick. Les routines 
seraient les suivantes : 



Valeur 


Routine 


Mouvement correspondent 





NOP 


routine ne faisant rien du tout 


1 


HAUT 


deplacement vers le haut 


2 


BAS 


deplacement vers le bas 


3 


NOP 


rien du tout 


4 


GAUCHE 


vers la gauche 


5 


DIAG1 


vers la gauche et en haut 


6 


DIAG2 


vers la gauche et en bas 


7 


GAUCHE 


vers la gauche 


8 


DROITE 


vers la droite 


9 


DIAG3 


vers- la droite et en haut 


10 


DIAG4 


vers la droite et en bas 


11 


DROITE 


vers la droite 


12 


NOP 


rien 


13 


GAUCHE 


vers la gauche 


14 


DROITE 


vers la droite 


15 


NOP 


rien 



Si nous plagons les adresses de chacune de ces routines dans la table 
(2 octets par adresse), I'adresse ecran originate dans HL (a modifier si le 
joystick indique un deplacement) et le code joystick dans A, nous pouvons 
sauter a la routine voulue par la sequence suivante : 



AND $OF 



RLA 



: ceci permet de ne garder que les quatre bits de 
droite du code joystick, et d'obtenir la valeur 
entre et 15 ; 

: ceci d6cale A vers la gauche d'un bit, recopiant 
le Carry dans le bit 0. Ce dernier vaut z6ro car le 
AND precedent positionne toujours le Carry a 
zero. RLA est done alors equivalent h une multi- 
plication par 2 du registre A. Ceci donne la 
position relative de I'adresse de noire routine 
par rapport au premier octet de la table. Si le 
code joystick etait 0, nous obtenons 0. Si e'etait 
3, le resultat est 6 (I'adresse a recuperer occupe 
alors les 6 e et T octets de la table) ; 



182 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 



LD 
LD 


E,A 
DUD 


LD 


IX, TABLE 


ADD 


IX,DE 


LD 
LD 


E,(IX+0} 

D,(IX+1) 


PUSH 
POP 


DE 
IX 



JP 



(IX) 



ceci place le resultat precedent dans le registre 

DE afin de pouvoir I'additionner facilement a 

I'adresse de debut de la table ; 

on place dans le registre 16 bits IX I'adresse de 

debut de la table ; 

on obtient ici I'adresse ou se situe I'adresse de la 

routine voulue. II faut encore la recuperer ; 

ce qui est fait : I'adresse de la routine se trouve 
dans DE ; 

on la passe a IX (car Instruction JP (DE) n'existe 
pas) ; 

et on saute enfin a la routine, I'adresse ecran 
originate etant toujours dans HL 



DEPLACEMENTS PAR CALCUL D'ADRESSES 



II nous reste enfin a programmer chacune des routines de mouvement. 
Les diagonales sont les plus simples, par exemple, DIAG1 sera constitute 
comme suit : 



DIAG1: CALL GAUCHE 

JP HAUT 



II s'agit d'une simple decomposition en deux mouvements lineaires. 

Les deplacements horizontaux ne posent pas de problemes non plus, 
excepte celui des bords de I' ecran. En effet, un deplacement vers la gauche 
a partir du bord gauche place la nouvelle position a droite, 8 lignes plus 
haut. II n'existe malheureusement pas de moyen simple d'eviter cela, sinon 
en memorisant la position horizontale en plus de la position ecran. II faut 
alors verifier que la position reste entre et 79 (ou $00 et $4F). Si ce n'est 
pas le cas, on peut ou bien inhiber le mouvement (les bords horizontaux 
sont infranchissables, ou bien intervertir la position (les bords sont 
cycliques). 

Ce test est a effectuer en plus dans !es routines GAUCHE et DROITE. 
Nous n'allons pas les effectuer. En revanche, nous reviendrons sur le 
probleme lors du chapitre 8, lorsque nous mettrons en place un systeme de 
coordonnees. GAUCHE et DROITE sont done simplement constitu^s d'une 
instruction DEC HL ou INC HL suivie d'un RET. 



DEPLACEMENTS PAR CALCUL D'ADRESSES I 183 

Les choses perdent leur aspect simpiiste pour HAUT et BAS. La solution 
simple est d'appeler les routines systemes $BC26 et $BC29. Une autre 
solution, plus rapide et plus elegante, est d'etudier la structure ecran pour 
trouver un equivalent. Un deplacement vers le bas est assez simple, nous 
I'avons d'ailleurs deja evoque. II suffit en effet d'ajouter $800 a I'adresse. Si 
('addition 16 bits provoque un Carry, alors il faut rajouter $C050. La 
programmation est la suivante, HL contenant I'adresse : 

HAUT : LD DE, $800 

ADD HL,DE : premiere addition 

RET NC : pas de Carry : le travail est fini 

LD DE,$C050 

ADD HL,DE : seconde addition 

RET 

L'explication de ce calcul est plus simple qu'il n'y parait. Le positionne- 
ment du Carry se produit lorsque le resultat de I'addition depasse $FFFF, 
c 'est-i-dire le bout de la memoire ecran. C'est justement ce qui permet de 
distinguer les sauts de ligne speciaux des autres. Et dans ce cas, il suffit 
d'ajouter $C050 pour obtenir la bonne adresse. 

Pour un deplacement vers le bas, la logique est la meme, bien que la 
programmation soit un petit peu moins simple. II suffit de retrancher $800. 
Si I'adresse obtenue depasse le debut de la memoire ecran (c'est-a-dire 
qu'elle se situe avant celui-ci), alors on retranche egalement $C050. C'est 
exactement I'operation inverse de la precedente. Mais un probleme se 
pose : le debut de I'ecran se situe en $COO0. Pour savoir si I'adresse 
obtenue se situe avant ou apres, il est done impossible de tester le Carry. 
Celui-ci ne sera pas specialement positionne si I'addition produit un 
nombre entre $0000 et $BFFF. Par contre, nous pouvons tester le poids fort 
de I'adresse. S'il est compris entre $C0 et $FF (bornes incluses), alors 
I'adresse est toujours dans I'ecran. Sinon, il faut retrancher $C050. 

Par commodite, nous n'allons pas utiliser la soustraction 16 bits. En effet, 
seul SBC existe, et il faut done remettre le Carry a z6ro avant chaque 
soustraction. Nous pouvons par contre ajouter le complement a 1, ce qui 
revient au meme. Voici le programme correspondent : 

BAS : LD DE,$F800 

ADD HL,DE : equivaut a soustraire $800 

LD A,H : on place le poids fort dans A 

CP $C0 : comparer 

RET NC : le poids fort est sup6rieur ou 6gal a $C0 et 

inferieur a $FF, done I'adresse est bien dans 

I'ecran, le travail est fini. 
LD DE,$3BFO 

ADD HL,DE : equivaut a soustraire $C050. 
RET 



184 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 

CONSEQUENCES DE LA STRUCTURE 
DE LA MEMOIRE ECRAN 



Nous poss^dons tous les Elements pour r6aliser la routine complete. Le 
programme 6.1 en assembleur les resume. Le programme 6.2 en Basic est 
une application de cette routine, basee sur le programme 4.4 et permettant 
le emplacement, grSce au joystick, du petit module extraterrestre du 
chapitre 4. Tous les mouvements sont autorises, et cela sans gestion 
complexe de POKEs au niveau du Basic. Notez que ce programme utilise le 
fichier DESSINS.BIN cr6e au chapitre 4 (par le programme 4.3), ainsi que la 
routine 4.1 de restitution d'objet. 







10; 












20 ; Programs de deplaceoent 


par joystick 






30 ;progranae 6.1 








40 ; Entree 


: 










50; 


la 


variable ECRAN contient l'adresse ecran 






60; 




a recalculer 


en fonction de l'etat du joystick 






70; 








45A0 




88 ECRAN: 
90; 


EQU 


ma 




ota 




in 


ORG 


&4C00 




4C09 


CD24BB 


us 


CALL #BB24 


;get joystick state 


4C03 


2AA045 


120 


LD 


HL, (ECRAN) 




4C06 


CD0D4C 


130 


CALL DEPLAC 




4C09 


22A045 


140 


LD 


(ECRAN), HL 




4C0C 


C9 


150 
160 ; 


RET 






4C0D 


E60F 


170 DEPLAC: 


AND 


S0F 


;garde 4 bits de droite 


4C0F 


17 


180 


RLA 




;fflultiplie par deux 


4C10 


5F 


190 


LD 


E,A 




4C11 


16(30 


m 


LD 


D,0 


;transfert de 1 'offset 16 bits 
dans DE 


4C13 


DD21244C 


210 


LD 


IX,TABLE 




4C17 


DD19 


220 


ADD 


IX, DE 


jcalcul localisation de 
l'adresse de saut 


4C19 


DD5E00 


230 


LD 


E,tn+ai 




4C1C 


DD5601 


240 


LD 


D,(IX+1) 


jrecupere adresse de saut 

dans DE 


4C1F 


D5 


250 


PUSH DE 




4C20 


DDE1 


260 


POP 


IX 


jtrans-fert dans IX 


4C22 


DDE9 


270 
280 ; 


JP 


(IX) 


;et saut a la routine 






290 J la table de saut 








300 ; 









D6PLACEMENTS PAR CALCUL D'ADRESSES I 185 



4C24 774C 


310 TABLE: 


DEFW NOP 


4C26 4E4C 


320 


DEFW HAUT 


4C28 444C 


330 


DEFW BAS 


4C2A 774C 


340 


DEFW NOP 


4C2C 5B4C 


350 


DEFW GAUCHE 


4C2E 5F4C 


360 


DEFW DIAGl 


4C30 654C 


370 


DEFW DIA62 


4C32 5B4C 


380 


DEFW GAUCHE 


4C34 5D4C 


390 


DEFW DRQITE 


4C36 6B4C 


400 


DEFWDIAG3 


4C38 714C 


410 


DEFW DIA64 


4C3A 5D4C 


420 


DEFW DRQITE 


4C3C 774C 


430 


DEFW NOP 


4C3E 4E4C 


440 


DEFW HAUT 


4C40 444C 


450 


DEFW BAS 


4C42 774C 


460 
470 ; 


DEFW NOP 




480 ;les quatres deplacements elenentaires 




490 ; 




4C44 110B08 


500 BAG: 


LD DE r S8ffl 


C47 19 


510 


ADD HL,DE 


4C48 D0 


520 


RET NC ;tou 


4C49 1150C0 


530 


LD DE,#C050 


4C4C 19 


540 


ADD HL,DE 


4C4D C9 


550 

560 ; 


RET 


4C4E 1100F8 


570 HAUT: 


LD DE,#F800 


4C51 19 


580 


ADD HL,DE 


4C52 7C 


590 


LD A,H 


4C53 FEC0 


600 


CP #C0 


4C55 D0 


610 


RET NC jtou 


4C56 11B03F 


620 


LD DE,#3FB0 


4C59 19 


630 


ADD HL,DE 


4C5A C9 


640 
650 ; 


RET 


4C5B 2B 


668 GAUCHE 


: DEC HL 


4C5C C9 


670 
688 ; 


RET 


4C5D 23 


690 DRQITE 


: INC HL 


4C5E C9 


700 
710 ; 


RET 




720 ;les quatres diagonales 




730 ; 




4C5F CD5B4C 


748 DIAGl; 


CALL GAUCHE 


4C62 C34E4C 


750 
769 ; 


JP HAUT 


4C65 CD5B4C 


770 DIAG2: 


CALL GAUCHE 


4C6S C3444C 


780 
790 ; 


JP BAS 



jtoujours dans l'ecran 



jtoujours dans l'ecran 



186 I GRAPHiSMES FN ASSEM8LEUR SUR AMSTRAD 



4C6B CD5D4C 

4C6E C34E4C 

4C71 CD5D4C 

4C74 C3444C 



4C77 C9 



3fl0 DIAS3: CALL DRQITE 
310 JP HAUT 

829 ; 

830 DIAS4: CALL DRQITE 

849 JP BAS 

850 ; 

868 ;RIEN ! 

870 ; 

880 NOP: RET 



Pass 2 errors: m 



' ******************** 

'** Programme 6.2 ** 
' ******************** 

'deplacemant d'un objet en plusieurs phases 
'd'apres le codage effectue par programme 4-3 
'aux adresses $2-fff et suite. 
'application des routines 6-1 et 4.1 



THEN 230 



THEN PR I NT "Er 



10 

20 

30 

40 

50 

60 

70 

80 

90 ' 

100 MEMORY &2FFF 

110 ad=&4700:lign=200 

120 ctrl=0:READ c*= IF c$="fin" 

130 FOR i=l TO LENCc*) STEP 2 

140 c=VAL<"&"+MID:£<c$,i ,2) ) 

150 POKE ad,c:ad=ad+l:ctrl=ctrl+c 

160 NEXT: READ taste: IF testeOctrl 

reur DATA li gne"l ign: END 
170 lign=lign+10:GOTO 120 
180 ' 
170 
200 

210 DATA 
220 ' 

230 ad=S-.4C00:lign=310 
240 ctrl=0:READ c$: IF c$="fin" 
250 FOR i=l TO LEN(c$) STEP 2 
260 c=VAL("&"+MID$(c$,i ,2) > 
270 POKE ad,c:ad=ad+l:ctrl=ctrl+c 
280 NEXT:READ teste: IF testeOctrl 

reur DATA 1 i gne " 1 i gn = END 
290 lign=lign+10:GOTO 240 
300 ' 
310 DATA CD24BB2AA045CD0D4C22A045C9E60F17, 



DATA ED5BAB452A9C453AA74547C5D53AA64: 
DATA 4F0600EDB0EBE1CD26BCEBC1 10EDC9, 
"-fin" 



THEN 4G0 



&JL 



189 

71 



THEN FRINT"Er 



172! 



20 DATA 5F1600DD21244CDD19DD5E33DD5601D5, 1 



330 


DATA 


340 


DATA 


350 


DATA 


360 


DATA 


370 


DATA 


380 


DATA 


390 


DATA 


400 


MODE 


410 


LOAD 



DEPLACEMENTS PAR CALCUL D'ADRESSES 1 187 

DDE1DDE9774C4E4C444C774C5B4C5F4C , 1926 

654C5B4C5D4C6B4C7 1 4C5D4C774C4E4C , 1 403 

444C774C11000819D0II50C019C91100, 1129 

FQ 1 97CFEC0D0 1 1 B03F 1 9C92BC923C9CD , 22 1 B 

5B4CC34E4CCD5B4CC3444CCD5D4CC34E , 1 S74 

4CCD5D4CC3444CC9, 990 

"fin" 



image- bin" ,&C000: 'chargement du decor, 

optionnel 

420 FOR 1=0 TO 15 

430 INK I,ASC(MID$("ACLFSPGJ0rJXSDZG'' f I + l,l)>-65 

440 ' INK I,ASC<MID$( ,, AMTQSV9JRCJXSRYQ",I + 1,1) ) -6 

5 pour monochrome 
450 NEXT 
460 ecr=50032 
470 POKE &45A0,ecr-256-*INT(ecr/256):POKE &45A1,I 

NT(ecr/256) 
480 POKE &45A6,7: ' largeur en oc 

tets 
490 POKE &45A7,10:' hauteur en n 

ombre de lignes 
500 LOAD"dessins" ,S<3000 
510 FOR phase=l TO 6 

520 bu-f (phase) =&3000+ C phase- 1) *(7*10) 
530 NEXT 
540 ' 

550 FOR phase=l TO 6 
560 POKE &459C,bu-f (phase) -256*INT (bu-f (phase) /256 

>:POKE &459D,INT(bu* (phase) /256) 
570 FOR k=l TO 4 
580 CALL &4C00 
590 CALL &4700 
600 FOR i = i TO 10s NEXT 
610 NEXT 
620 NEXT 
630 GOTO 550 



Modifications de 6.2 pour 6.2b 

460 ecr=50032 

480 POKE &45A&,13:' largeur en a 

ctets 
490 POKE Sc45A7,33: ' hauteur en n 

ombre de lignes 
500 LOAD " dessi nsB " , &3B00 
520 buf (phase) =&3000+ (phase- 1) *( 13*33) 



188 I GRAPHISMES EN ASS5MBLEUR SUR AMSTRAD 
Modifications de 6.2 pour 6.2c 

460 ecr=59104 

480 POKE &45A&,21s ' largeur en o 

ctets 
490 FOKE &45A7,L9:' hauteur en n 

ombre de lignes 
500 LQAD"dessinsC",&3000 
520 bu-f (phase) =&3000+ (phase-!)* (21*19) 



Vous remarquerez un defaut du programme : lorsque le module dis- 
parait ou apparait par le haut de I'dcran, il laisse une trace de son passage. 
D'autre part, les deux lignes extremes (le haut de I'ecran et le bas) ne 
semblent pas correspondre. Ceci est du aux 384 octets inutilises de la 
memoire ecran. En effet, la derni&re ligne de I'feran est situee d I'adresse 
$FF80. Si nous descendons d'une ligne par notre routine de calcul, nous 
obtenons $FF80+$0800 soit $0780, avec positionnement du Carry. L'addi- 
tion suppl6mentaire de $C050 donne finalement$C7D0. Or, ce n'est pas du 
tout I'adresse du debut de la premiere ligne. Pour I'expliquer il faut se 
pencher sur les octets inemployes de la memoire ecran. En effet, celle-ci 
contient 200 lignes de 80 octets. Nous avons done 16 000 octets utilises 
pour I'ecran. Mais 16 Ko forment 16 384 octets. II reste done 384 octets 
inutilises. Si Ton respecte la logique de I'entrelacement des lignes, ces 
384 octets correspondent, par blocs de 48 octets, a une 201 B , 202° et jusqu'd 
une 208° ligne situ6es hors de I'ecran. Mais ces pseudo-lignes ne contenant 
que 48 octets faussent les calculs si Ton s'y aventure. Une vraie ligne 
contient 80 octets. Voild pourquoi un objet partant vers le bas de I'ecran 
disparatt sur 8 lignes imaginaires, avant de r6appara?tre en haut de I'ecran, 
un peu plus a gauche. C'est aussi la raison pour laquelle il laisse un trait 
lors de son passage. 

Ces d6fauts ne sont pas faciles d corriger pour I'instant. Nous en 
viendrons facilement a bout dans le chapitre8 en utilisant un systeme de 
coordonnees et en interdisant les sorties d'ecran. 



GESTION DES OBJETS -7 
SUR UN DECOR * 



190 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 



PROBLEMES DE DEPLACEMENT 



Toutes tes routines que nous avons realisees jusqu'a present permettent 
d'afficher des objets sans tenir compte de ce qui se trouve deja sur I'ecran. 
Cela interdit la gestion d'un decor integre 3 I'action. II faut done revoir 
integralement le principe d'affichage si nous voulons implementer une 
telle possibility. 

Plusieurs solutions s'offrent au programmeur dSsirant integrer un decor. 
Nous verrons dans le chapitre8 comment interdire aux objets mobiles 
I'acces a une zone de I'ecran. On peut utiliser cette solution pour placer un 
decor sur I'ecran et interdire tout deplacement sur la surface qu'il occupe. 
De cette fagon, tout objet pourra se deplacer simplement (avec ies routines 
du chapitre4). Mais la partie operationnelle de I'ecran devra etre integrale- 
ment couleur de fond. Les collisions entre objets risquent egalement de 
poser quelques problemes. La seule solution semble done d'autoriser les 
deplacements sur le fond de I'ecran. 

Le plus gros probleme pose est alors le suivant : sachant que I'objet 
occupe un rectangle sur I'ecran et qu'il va ecrasertotalement le contenu de 
ce rectangle, comment faire pour le restituer lorsque I'objet se deplacera a 
nouveau ? 

ECRAN 



OBJET 
















(■-•■- 


Safe! 












1 


' 



ZONE ECRASEE 
PAR L'OBJET 



Schema 7.1 



Probleme d'ecrasement de decor. 



II existe un grand nombre de solutions, et nous allons en etudier deux : li 
mode XOR et la gestion de transparence, 






GESTION OBJETS SUR DtCOR I 191 

LE MODE XOR 
XORbinaire 

Le mode XOR est une astuce tres utilisee depuis quelque temps dans les 
jeux. II allie une grande facilite d'utilisation a une rapidity de traitement 
in6galable. Mais, bien evidemment, il possede un gros defaut : il ne 
conserve pas les couleurs originales de I'objet affiche et du decor lorsque 
ceux-ci se superposent. 

Le principe de fonctionnement du mode XOR est base sur I'operation 
binaire du m§me nom. Le resultat d'un XOR sur deux bits est le suivant : si 
les deux bits sont identiques, on obtient 0. S'ils sont differents, le resultat 
est 1. Cette operation a une particularity : (A XOR B) XOR B donne A. En 
effet, si le bit original est 0, XOR ne change pas son etat et XOR 1 
I'inverse. Un second XOR redonne 0. Si le bit original est 1, deux XOR 
successifs donnent egalement 1. 

Cette particularity est le fondement du mode graphique XOR. Chaque 
octet de I'objet a placer est compost auparavant avec le contenu de I'ecran 
qu'il va ecraser. Puis, lorsqu'un deplacement intervient, on redessine de 
nouveau I'objet de la meme maniere avant de le deplacer. Cela constitue, 
sur 8 bits, I'operation (ECRAN XOR OBJET) XOR OBJET, dont le resultat est 
ECRAN. Sans aucune sauvegarde de I'ecran, nous recuperons done le 
contenu initial de celui-ci, simplement en dessinant deux fois I'objet a son 
emplacement. 

La routine de dessin en mode XOR sera quasiment identique a celle du 
chapitre4, excepte la copie d'une ligne qui se fera octet par octet, en 
composant chacun d'entre eux avec le contenu de I'ecran par I'operation 
XOR. 

Restitution d'objet en mode XOR 

Le programme assembleur 7.1 est done une imitation du 4.1 ; seules 
quelques lignes changent. 



10; 

28 jpragrafKae de copie d'objet 
30 ;RAM->Ecran, node XOR 
40 ; programme 7.1 

68 (KB 84808 

70 ; 



192 I GRAPHISMES EN ASSEWBLEUR SUR AMSTRAD 



ENTREE: (ECRAN) adresse du coin sup.gauche 

(BUF) adresse de 1'inage 

(LAR) noaibre d'octets par ligne 

<HAU> noafare de lignes 



459C 
45A0 

45A7 

4890 2AA845 

4803 ED5B9C45 

4807 3AA745 

480A 47 

480B C5 

480C E5 

4SSD 3AA645 

4810 47 

4811 1A 

4812 AE 

4813 77 

4814 23 

4815 13 

4816 10F9 

4818 El 

4819 CD26BC 
481C CI 
481D L0EC 
481F C9 



90 
100 
110 
120 
130 BUF: 
140 ECRAN: 
150 LAR: 
160 HAU: 
170 ; 
180 
190 
200 
210 
220 ; 

230 NEHLIN: 
240 
250 
260 

270 NEWQCT: 
280 
290 
300 
310 
320 
330 
340 
350 
360 
370 



EBU #459C 

EQU I45A0 

EQU ft45A6 

EQU I45A7 

LD HL, (ECRAN) 

U DE, (BUF) 

LD ft, (HAD) 

LD B,A 

PUSH BC 
PUSH HL 
LD A, (LAR) 
LD B,A 
LD A,(DE) 
XOR (HL) 
LD (HLJ,A 
INC HL 
INC DE 
DJNZ NEWQCT 
POP HL 
CALL »BC26 
POP BC 
DJNZ NEWLIN 
RET 



;coapteur de lignes 

jsauvegarde compteur 
jsauvegarde adresse ligne 

jcompteur da nombre d'octets 
;recupere octet dessin 
; intersection avec ecran 
;et positionnefflent sur 1 'ecran 



; ana en debut ligne 
jdescend d'une ligne 

j ligne suivante 



Pass 2 errors: 



L'instruction LDIR a notamment disparu au profit d'une boucles'effec- 
tuant LAR fois. Notez egalement I'inversion des registres DE et HL pour le 
travail : en effet, avec LDIR, DE pointe la destination et il etait done 
interessant de placer le pointeur ecran dans ce registre. Ici, i! n'en est plus 
question, nous pouvons done inverser les deux pointeurs : HL pour I'ecran 
et DE pour I'objet. Cela nous permet de rdaliser le XOR de la fa$on 
suivante : 



LD A, (DE) 
XOR (HL) 
LD (HL),A 



chargement de I'octet dessin dans le registre A; 

XOR avec I'octet de I'ecran ; 

et remise en place du resultat sur I'ecran. 



Nous pouvions bien entendu garder ('attribution originale des registres : 
dans ce cas, seul "LD (HL)^" se transformait en "LD (DE),A" pour envoyer 
I'octet a I'ecran. Mais cela aurait pose un probleme pour le passage a la 



GESTION OBJETS SUR D^COR I 193 

ligne suivante par la routine systeme #BC26. Cette routine travaiile en effet 
sur HL et non DE ; il aurait done fallu recourir a un "EX DE,HL" apres cet 
appel de routine, exactement comme au chapitre4. Utiliser HL pour le 
pointeur ecran nous permet d'6viter cette instruction perturbatrice. 

Le programme Basic 7.1 est une illustration de la routine. II deplace notre 
petit module extraterrestre en mode XOR. 



10 ' ******************** 

20 '** Programme 7-1 ** 

30 ' ******************** 

40 ' 

50 'deplacement d'un abjet en plusieurs phases e 

n mode XOR 
60 ' 

70 MEMORY &2FFF:L0AD"prog6. lob": 'voir annexe 6 
80 ad=&4S00:lign=160 

90 ctr 1=0: READ c$: IF c$="-f in" THEN 200 
100 FOR i = I TO LEN(c$) STEP 2 
110 c=VAL("& ,, +MID$Cc^,i,2)) 
120 POKE ad,c:ad=ad+l:ctrl=ctrl+c 
130 NEXT: READ teste: IF testeOctrl THEN PRINT"Er 

reur DATA 1 i gne " 1 i gn : END 
140 lign=lign+10:GOTO 90 
150 ' 
160 DATA 2AA045ED5B9C453AA74547C5E53AA645471AAE7 

7, 2298 
170 DATA 231310F9E1CD26BCC110ECC9, 1621 
130 DATA "-fin" 
190 ' 

200 MODE 
210 LOAD" i mage. bin",&C000: 'chargement du decor, 

optionnel 
220 FOR 1=0 TO 15 

230 INK I,ASC<MID*("ACLFSPGJOCJXSD2Q" f I+l,l> ) -65 
240 ' INK I ,ASC (MID* ( " AMTQ3VSJRC JX3RYQ" , 1+1 , 1 ) ) -6 

5 pour monochrome 



~> 



^> 



NEXT 



260 ecr=50032 

270 POKE &45A0,ecr-256*INT C ecr /256 ): POKE &45A1,I 

NT(ecr/256) 
280 POKE 8c45A6 f 7: ■ largeur en oc 

tets 
290 POKE &45A7,10s' hauteur en n 

ombre de lignes 
300 LOAD"dessins",&3000 
310 FOR phase=l TO 6 



194 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 

320 buf (phase) =&30B0-f (phase-1 ) * (7*10) 

330 NEXT 

340 ' 

350 FOR phase=l TO 6 

360 POKE &459C,buf (phase) -256* INT (buf (phase) /2! 

):POKE &459D, INT (bu-f (phase) /256) 
370 FOR k=i TO 4 
380 CALL &4C00 
390 CALL &48Q0 
400 FOR i = l TO 1:NEXT 
410 CALL &4B00 
420 NEXT 
430 NEXT 
440 GOTO 350 



Modifications de 7.1 pour 7.1b 

260 ecr=50032 

280 POKE &45A6,13:' largeur en a 

ctets 
290 POKE &45A7 f 33s ' hauteur en n 

ombre de lignes 
300 LOAD"dessinsB",&3000 
320 buf (phase) =&3000+ (phase-1 ) * ( 13*33) 



Modifications de 7.1 pour 7.1c 

260 ecr=50032 

280 POKE &45A6,21: ' largeur en o 

ctets 
290 POKE &45A7,19:' hauteur en n 

ombre de lignes 
300 LOAD n dessinsC ,, ,&3000 
320 buf (phase) =&3000+ (phase-1 ) * (21*19) 



Vous constatez que le mode XOR ne touche effectivement pas au d6cor, 
au contraire de la routine du chapitre4. Mais, si vous etes attentif au 
emplacement, vous remarquez le defaut 6voque plus haut : lorsqu'une 
partie de I'objet entre en contact avec le d6cor, les couleurs du dessin sont 
6trangement modifi6es. Par contre, aucune alteration n'a lieu sur les 
parties couleur de fond, qu'il s'agisse du fond de I'gcran ou des parties 
vides de I'objet (rappelons que celui-ci est inscrit dans un rectangle et 
comporte done un certain nombre de zones couleur de fond). L'explication 
du ph6nom§ne est simple : alors que A XOR donne toujours A, A XOR 1 



GESTION OBJETS SUR DECOR I 195 

donne le bit inverse de A. Nous composons le decor avec I'objet. Si Tun des 
deux est couleur de fond, tout se passe bien. Par contre, chaque bit a 1 de 
I'objet va inverser, lors du XOR, le bit correspondant du decor. Le contenu 
d'un octet etant constitue de masques de couleur, la composition de deux 
masques non nuls va produire un masque totalement different. Par 
exemple, considerons ce qui arrive si nous effectuons une telle operation. 

11111100 (masque indiquant deux points en stylo 7 sur 
I'objet) 
XOR 11000011 (deux points en stylo 9 sur I'ecran) 

00111100 ce resultat est place dans I'ecran. Or, il correspond 
a deux points en stylo 6. 

Le mode XOR n'a heureusement que ce seul defaut. Ses avantages le 
rendent en effet extremement souple d'emploi. La plupart des jeux d'action 
connus et reconnus comme excellents (y compris le plus beau de tous 
Sorcery/Sorcery+) utilise le mode XOR. II suffit de limiter (grace aux 
techniques du chapitre8) les zones de decor accessibles pour obtenir un 
resultat acceptable. Toutefois, si les couleurs sont mal choisies, il se peut 
que le mode XOR produise des horreurs lors des contacts objets/decor ou 
objet/objet. Par exemple, si un ensemble de points colores en stylo 7 
rencontre un ensemble de points en stylo 9, et que le stylo 6 est associe a 
I'encreO (noir), I'ensemble va disparaitre de I'ecran! Ce ne sera que 
provisoire bien sur, car un nouveau XOR redonnera le stylo 9. 

La precaution qui s'impose alors semble evidente : le stylo doit 
toujours etre pris comme stylo de fond. II est le seul a ne pas perturber les 
dessins en mode XOR. De plus, aucun autre stylo ne doit etre associe a la 
meme couleur que le stylo 0, afin d'eviter le probleme decrit ci-dessus. 

Malgre tout cela, vous pouvez retenir la legon suivante : le mode XOR 
possede de grandes qualites, le tout est de connaitre son defaut et d'en 
tenir compte, en sachant par avance qu'il faudra limiter les zones de 
recouvrement avec les decors ou les autres objets. 



TRANSPARENCE 



Pour les puristes qui ne veulent pas d'interferences XOR, il y a bien 
entendu une autre solution : la transparence du fond. Elle consiste a traiter 
I'objet uniquement et non plus la totality du rectangle qui le contient. Ceci 
afin d'avoir I'objet uniquement sur le decor. Bien entendu, le probleme de 
la restitution du decor se pose de nouveau. Mais il est facile a resoudre. Si 
nous supposons que I'objet subit un mouvement, voici la demarche a 
suivre : 

- d'abord replacer le decor la ou I'objet se situe pour I'instant; 

- puis memoriser le d6cor de I'endroit ou va se placer I'objet ; 

- enfin, dessiner I'objet & son nouvel emplacement. 



196 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 

La transposition de ce principe en programme suit exactement ce 
deroulement. La restitution du d6cor se fait simplement a I'aide de la 
routine 4.1 du chapitre4, permettant de restituer un objet. II faut bien 
entendu que ce d6cor ait pr6alablement 6te sauvegarde avant le premier 
affichage. La memorisation se fait justement avec la routine 4.2. Enfin, il 
nous reste la dernidre partie, qui s'inspire de la routine XOR 7.1 (laquelle 
provenait du chapitre4). La Ieg6re modification qui doit etre incluse est la 
suivante : si un octet de I'objet est de la couleur du fond, il ne doit pas etre 
affiche. De cette fagon, seul I'objet sera place sur I'ecran, parfaitement 
int6gre au d6cor. 

La routine 7.2 suit done le travail desormais classique des routines 4.1 et 
7.1, excepte ce point de detail vite resolu ne necessitant pas de commen- 
taire supplemental. 







10 ; 












20 jprograme de copie d objet apres deplacement 






30 ;RAM->Ecran 


FOND TRANSPARENT 








40 ; programme 7.2 








50; 








4830 




60 
70 ; 


ORG 


44830 








80 ;ENTREE 


: (ECRAN) adresse du coin 


sup. gauche 






90 ; 


(BUF) adresse de 1 'image 






100 ; 


(LAR) nombre d 'octets 


par ligne 






110 ; 


(HAU) nombre de lignes 






120 ; 








459C 




130 BUF: 


EQU 


B459C 




45A0 




140 ECRAN: 


EQU 


#45A0 




45A6 




ISO LAR: 


EQU 


845A6 




45A7 




160 HAU: 
170 ; 


EQU 


#45A7 




4830 


2AA045 


180 


LD 


HL, (ECRAN) 




4833 


ED5B9C45 


190 


LB 


DE, (BUF) 




4837 


3AA745 


200 


LD 


A, (HAU) 




483A 


47 


210 
220 ; 


LD- 


B,A 


jcoapteur de lignes 


483B 


C5 


230 NEULIN 


PUSH BC 




483C 


E5 


240 


PUSHHL 




483D 


3AA645 


250 


LD 


A, (LAR) 




4840 


47 


260 
270 ; 


LD 


B,A 


jnombre d 'octets 


4841 


1A 


280 NEWQCT: 


LD 


A,(DE) 


; octet de I'objet 


4842 


B7 


290 


OR 


A 


jfond ? 


4843 


CA4748 


300 


JP 


Z,0K 


;oui:pas de transfert 


4846 


77 


310 
320 : 


LD 


(HL) ,A 


;transfere a I'ecran 



GESTION OBJETS SUR D£COR I 197 



4847 23 

4848 13 

4849 10F6 
4B4B El 
484C CD2&BC 
484F CI 

4850 10E9 
4852 C9 

Pass 2 errors: 



330 OK: 
34C 

350 
360 
370 
38fi 
390 

m 



INC HL 
INC DE 
DJNZ NEWOCT 
POP HL 
CALL #BC26 
POP BC 
DJNZ NEWLIN 
RET 



jligne plus bas ecran 



Le programme 7.3 montre 1'application de cette routine h nos objets. 
Malgre la simplicity des routines mises en ceuvre, te listing Basic presente 
une allure inquietante. 



10 
20 
30 
40 
50 



' ******************* 

' ** programme 7.3 ** 
r ******************* 



'Programme illustrant la restitution avec dec 

or garde. 
60 ' 

70 MEMORY &2FFF 
30 LCAD"prog6. lob": :L0AD ,, prag4 

Ob" s 'voir annexe 6 
90 ad=&4830:lign=170 
100 ctrl=0:READ c$: IF c$="-fin" 
110 FOR i = l TO LEN(c$> STEP 2 
120 c=VAL<"& ,, +MID*<c* 1 i,2> > 

POKE ati,c:ad=ad+l:ctrl=ctrH-c 



lob": LOAD "prog4 



THEN 203 



130 
140 



NEXT:READ teste: IF testeOctrl THEN PRINT"Er 



reur DATA ligne"! ignzEND 
150 lign=lign+10:GOTO 100 

160 ' 

170 DATA 2AA045ED539C453AA74547C5E53AA645471AB7C 

A, 2390 
180 DATA 474877231310F6E1CD26BCC110E9C9, 1Q77 
190 DATA "-fin" 
200 MODE 
210 LOAD"image,. bin" ,&C000: 'chargement du decor, 

optionnel 

220 FOR 1=0 TO 15 

230 INK I,ASC<MID$("ACLFSP6J0LJXSDZQ n ,I+l,l> ) -65 
240 'INK I,ASC(!HD*("Ar1TQSVSJRCJXSRYQ M ,1 + 1,1) )-6 
5 pour monochrome 



198 I GRAPHEMES EN ASSEMBLEUR SUR AMSTRAD 

250 NEXT 

260 LOAD ,, dessins" ,&3000 

270 FOR i=l TO 6 

280 c=&3000+(i-l)*(7*10) 

290 bu* (i ,0)=c-256*INT(c/256) : bu-f Ci , 1 ) =INT (c/256 

) 

300 NEXT 

310 POKE &45A6,7 

320 POKE &45A7 f 10 

330 ' 

340 ad=51369=P0KE &45A0, ad-256*INT (ad/256) = POKE 

&45A1, INT (ad/256) 
350 POKE &459C,0:POKE &459D,&80: CALL &4730:'init 

. sauvegarde decor 
360 " 

370 FOR p=l TO 6 

380 POKE &459C,0:POKE &459D,&80: CALL &4700 
390 CALL &4C00: 'deplacement 
400 CALL &47: 2) 

410 POKE &45VC,buf (p,0) : POKE &459D,buf (p , 1) 
420 CALL &4830:FOR i=l TO 10: NEXT: CALL &BD19 
430 NEXT 
440 GOTO 370 



Modifications 7.3 pour 7.3 b 

260 LOAC'dessinsB" ,&3000 
280 c=&3000-Ki-l)* (13*33) 
310 POKE &45A6,13 
320 POKE &45A7,33 

340 ad=51369:P0KE &45A0,ad-256*INT (ad/256) : POKE 
&45A1 , INT (ad/256) 
i0 POKE Sc439C,0:POKE &459D,&80: CALL &4730:'ini 



■ BZ i 



. sauvegarde decor 
380 POKE &459C ,0= POKE &459D,&80: CALL &47O0 



Modifications 7.3 pour 7.3 c 

260 LOAD"dessinsC u ,&3000 

230 c=&3000+(i-l)*(21*19) 

310 POKE &45A6,21 

320 POKE &45A7,i9 

340 ad=51369:F0KE &45A0,ad-256*INT (ad/256) : POKE 

&45A1, INT (ad/256) 
350 POKE &459C,0:POKE &459D,&80: CALL &4730:'init 

. sauvegarde decor 
3S0 POKE &459C,0:POKE &459D ,&80: CALL &4700 



GESTION OBJETS SUR DECOR I 199 

Les POKEs correspondent aux operations suivantes : 

- initialiser LAR et HAU ; 

- initialiser ECRAN sur la premiere position du module; 

- initialiser BUF sur la zone memoire reservee au stockage du decor (cette 
zone sera de meme taille que I'objet) ; 

- CALL routine 4.2 pour sauvegarder le decor. 

Puis on entre £ I'interieur de la boucle modifiant I'adresse ecran de 
I'objet : 

- initialiser BUF sur la zone de sauvegarde de decor; 

- CALL routine 4.1 pour restituer le decor; 

- initialiser ECRAN sur AD actuelle ; 

- CALL routine 4.2 pour sauver le nouveau decor ; 

- initialiser BUF sur I'objet; 

- CALL routine 7.2 pour afficher I'objet sur le decor ; 

- continuer en changeant I'adresse. 



PROBLEMES DE RAPIDITE 



Vous constatez neanmoins aisement que I'animation n'est pas tr&s belie. 
Certes, I'objet se deplace reellement sur le decor. Mais le deplacement le 
fait flasher legerernent, comme s'il etait transparent. Cela est du a la 
methode utilisee. Entre deux affichages consecutifs de I'objet celui-ci est 
efface. La persistance de la vision nous empeche de voir le vide en 
resultant. Ce vide se mele aux images de I'objet et produit une sorte d'effet 
de transparence. La solution de ce probldme consiste h laisser beaucoup 
plus longtemps I'objet affiche qu'efface. II existe aussi une autre solution 
plus astucieuse, plus souple, et surtout plus propre : au lieu d'appiiquer le 
principe en trois etapes vu ci-dessus, on le programme pour chaque octet 
de I'objet. II faut alors gerer simultanement deux adresses ecran (I'an- 
cienne et la nouvelle) et deux pointeurs en memoire (celui de I'objet et 
celui de la zone de sauvegarde du decor). L'avantage de cette methode est 
la disparition du vide entre deux images de I'objet, puisque celui-ci est 
efface et reaffiche, octet par octet, et non plus integralement. En revanche, 
une routine utilisant quatre pointeurs pose des problemes de programma- 
tion non negligeables sur I'Amstrad, les registres secondaires n'etant pas 
disponibles. Mais rien n'en interdit la programrnation. IX et IY peuvent etre 
utilises, ainsi que HL et DE. 



GESTION DES AVANT-PLANS 



Nous savons maintenant comment deplacer un objet sur un decor. Que 
diriez-vous de le faire passer derriere ? Nous pourrions ainsi simuler une 
sorte de profondeur de decor. 



200 i GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 




8 

<b 

49 

a 

§ 






o 



GESTION OBJETS SUR DECOR I 201 

La gestion de graphismes en trois dimensions est un sujet plus large que 
notre ouvrage ne peut traiter. Mais nous pouvons, sans trop de difficulte, 
gerer ce que I'on appeile des "AVANT-PLANS". En clair, nous pourrons 
placer sur I'ecran un certain nombre d'objets, elements de decor qui se 
situeront logiquement devant les objets mobiles, et non derriere. Conse- 
quence : lorsque les avant-plans et les objets se rencontrent sur i'ecran, 
seuls les premiers restent visibles. II s'agit en quelque sorte de Tinverse du 
fond (schema 7.2 v. p. 200). 

Cette derniere reflexion est d'ailleurs moins innocente qu'il n'y parait. 
Elle nous donne la logique de base qui va nous permettre de gerer 
quelques avant-plans simples. En effet, il nous suffit pour cela d'inverser le 
principe de la couleur de fond ; si un octet de couleur de fond rencontre un 
autre octet, c'est ce dernier qui I'emporte. Un objet pourra etre d'avant-plan 
s'il est colore en stylo 15, par exemple. Dans ce cas, le principe sera le 
suivant : lorsqu'un octet de la couleur 15 rencontre un octet, il I'emporte. 

Pour appliquer le principe des avant-plans de cette maniere, il suffit de 
choisir 8 stylos pour les objets et decors, et 8 pour les avant-plans. Pour 
obtenir un bel effet, on peut associer ces 8 stylos aux memes couleurs 
respectives. Les objets et avant-plans seront alors indissociables tant qu'il 
n'y aura pas contact entre eux. 

Enfin, notre routine de transparence travaille sur un octet compiet, soit 
deux points. Pour traiter chaque point individuellement, il faut compliquer 
le travail, utiliser les masques de points pour isoler chacun des deux et les 
traiter separement, et les masques de stylos pour savoir s'ils correspon- 
dent au point, cela pour chaque octet bien entendu. C'est ce qui differencie 
la routine 7.4 des 7.2, 7.1 et 4.1 Son fonctionnement est un peu plus 
complexe. 



10; 

20 ; programme de copie d 'objet 

30 ;RAM->Ecran, FONQ TRANSPARENT, couleurs 8 a 15 en avant-plan 

40 ; programme 7.4 



4760 



459C 
45A0 
45A6 
45A7 



00 

70 

80 

90 
1(30 
110 
120 
150 BUF: 
140 ECRAN: 
150 LAR: 
160 HAU: 



ORG #4760 

ENTREE: (ECRAN) adresse du coin sup. gauche 

(BUF) adresse de 1' image 

(LAR) nombre d 'octets par ligne 

(HAU) nombre de lignes 



EQU 
EQU 
EQU 

EQU 



tt45?C 

#45A0 
#45A6 
#45A7 



202 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 







170 ; 








4760 


2AA045 


180 


LD 


HL, (ECRAN) 




4763 


ED5B9C45 


190 


LD 


DE, (BUF) 




4767 


3AA745 


200 


LD 


A,(HAU) 




476A 


47 


210 
220 ; 


LD 


6, A 


;cofflpteur de lignes 


476B 


C5 


230 NEWLIN: 


PUSH BC 


jsauvegarde compteur 


476C 


E5 


240 


PUSH HL 


;sauvegarde adresse ligne 


476D 


3AA645 


250 


LD 


A,(LAR) 




4770 


47 


260 


LD 


B f A 


jcorapteur du noabre d'octets 


4771 


7E 


270 NEWOCT: 


LD 


A,(HL) 


; octet ecran 


4772 


0F 


280 


RRCA 




;decale a droite 


4773 


CDA847 


290 


CALL MASK 


;transforae en minero stylo 


4776 


CB5F 


300 


BIT 


3,A 


jcouleur d'avant-plan ? 


4778 


C28747 


310 


JP 


NZ,P0INT2 


;oui: rien a -faire, traiter 
point droit 


477B 


1A 


320 


LD 


ft, IDE) 


; octet objet 


477C 


E6AA 


330 


AND 


7.10101010 


; garde point de gauche 


477E 


CAB747 


340 


JP 


Z,P0INT2 


;couleur fond: pas d'af-fichage 


4781 


4F 


350 


LD 


C,A 


;sinon, garder dans C 


4782 


7E 


360 


LD 


A,(HL) 




4783 


E655 


370 


AND 


Z01010101 


;garder seuleaent point droit 


4785 


Bl 


380 


OR 


C 


;ajouter point gauche objet 


4786 


77 


390 

400 ; 


LD 


(HL),A 


;renii5e en place nouvel octet 
ecran 


4787 


7E 


410 P0INT2 


LD 


A,(HL) 


;prend octet ecran 


4788 


CDAB47 


420 


CALL MASK 


jtransforne en no stylo 


478B 


CB5F 


430 


BIT 


3, A 


;couleur d'avant-plan ? 


478D 


C29C47 


440 


JP 


NZ,QK 


;oui:rien a transferer 


4790 


1A 


450 


LD 


A,(DE) 


j octet objet 


4791 


E655 


460 


AND 


7.01010101 


;garde point droite 


4793 


CA9C47 


470 


JP 


Z,OK 


;fond:pas de transfert 


4796 


4F 


480 


LD 


C,A 


; garde pour or. 


4797 


7E 


490 


LD 


A,(HL) 


; octet ecran 


4798 


E6AA 


500 


AND 


7.1010101B 


;garde point gauche 


479A 


Bl 


510 


OR 


C 


;ajoute point droit 


479B 


77 


520 
530 ; 
540 ; 


LD 


(HL),A 


; remise a jour ecran 


479C 


23 


550 OK: 


INC 


HL 




479D 


13 


560 


INC 


DE 




479E 


10D1 


570 


DJNZ NEWOCT 




47A0 


El 


580 


POP 


HL 


;ancien debut ligne 


47A1 


CD26BC 


590 


CALL8BC26 


; descend d'une ligne 


47A4 


CI 


600 


POP 


BC 




47A5 


10C4 


610 


DJNZ NEWLIN 


jligne suivante 


47A7 


C9 


620 
630 : 


RET 







GESTION OBJETS SUR DECOR I 203 



648 ; trans-fame le (Basque donne dans A 
650 : en numero de stylo 





660 ; (tsasque suppose du point de 


droite, 




678 ; done de 1 


a forse 0x0x0x0x) 






680 ; 








47A8 4F 


690 MASK: 


LB 


C,A 


$ passe masque dans C 


47ft9 3E00 


700 


LD 


A,Q 


jnumera ais a zero 


47AB CB29 


710 


SRA 


C 


;bit 1 dans Carry 


47AD D2B247 


720 


JP 


NC.JUM 


;pas de bitl positionne 


47B0 3E08 


730 


LD 


A,a 


;poids de ce bit dans le 
nuraero stylo 


47B2 CB29 


740 JIM: 


SRA 


c 




47B4 CB29 


750 


SRA 


c 


;bit 3 dans carry 


47B6 D2BB47 


760 


JP 


NC,JUM2 


;bit 3 pas positionne 


4769 C602 


770 


ADD 


A,2 


;poids du bit 3 


47BB CB29 


780 JUM2: 


SRA 


C 




47BD CB29 


790 


SRA 


C 


;bit 5 dans carry 


47BF D2C447 


800 


JP 


NC,JUM3 


j pas positionne 


47C2 C604 


810 


ADD 


A,4 


-poids du bit 5 


47C4 CB29 


820 JUM3: 


SRA 


C 




47C6 CB29 


830 


SRA 


C 


;bit 7 dans carry 


47C8 D0 


840 


RET 


NC 


;pas positionne: fin du travail 


47C9 3C 


353 


INC 


A 


;poids=i 


47CA C9 


860 


RET 






Pass 2 errors: 


00 









Le registre HL pointe sur l'6cran, DE sur I'objet a restituer. NEWOCT est le 
debut du traitement d'un octet de I'objet. Tout d'abord, I'instruction RRCA 
d^cale cet octet & droite de facon & r6cuperer le num6ro de stylo du point 
gauche. CALL MASK effectue le calcul. Celui-ci additionne 1, 2, 4 et 8 dans 
le registre A en fonction des bits positionnes du point. Reportez-vous & 
I'annexe 3 pour avoit une liste des masques de points. 

Une fois le numero de stylo calculi (compris entre et 15), un test "BIT 
3,A" permet de savoir si celui-ci est sup^rieur a 7. Si le bit est positionne, le 
stylo est compris entre 8 et 15. II s'agit d'une couleur d'avant-plan. Dans ce 
cas, la routine saute au traitement du point de droite : I'objet n'est pas 
restitu6, il disparait done derriere I'avant-plan. 



Par contre si le stylo est inferieur a 8, il faut done restituer I'octet de 
I'objet. Mais il faut 6galement traiter la transparence. Pour cela, I'octet de 
I'objet passe par un masque 10101010 binaire. Seuls les bits du point de 
gauche sont gardes. Si le resultat est 0, alors le point est de la couleur du 
fond, il ne doit done pas ecraser le decor. Aucune modification n'est 
effectuee sur i'6cran. 



204 I GRAPHISMES EN ASSEMBLEUR 5UR AMSTRAD 

Enfin, dernier cas f nous plagons ce point sur I'ecran sans effacer le point 
de droite de I'ecran de la fagon suivante : 

LD C,A : ie registre C regoit le masque du point de gauche 

(apres AND avec 10101010, le registre A contient 
xOxOxOxO, soit i'etat du point de gauche) ; 

LD A,(HL) : A contient maintenant I'octet de I'ecran ; 

AND 01010101 : ceci efface I'etat du point gauche de I'ecran; 

OR C : et on ajoute le nouveau point de gauche calcule ; 

LD (HL),A : on remet en place cet octet dans I'ecran. 

Ensuite, on effectue la m§me manipulation sur le point de droite. 
L'apparente complexity des manoeuvres est trompeuse : la routine est 
aussi rapide (d'un point de vue visuel) que son equivalent ne traitant pas 
les points mais les octets. En effet, les operations ajoutees sont pour la 
plupart des AND et des decalages. Ces operations sont extremement 
rapides. 



n 



i ' *******■**•*****-*****-* 

20 '*■* programme 7.4 ** 

30 ' ******************** 

40 ' 

50 'Programme illustrant la restitution avec dec 

or garde. 

60 ' 

70 MEMORY &2FFF 

80 l_OAD"prog6. lob": :L0AD"prog4. lob" :LQAD"prog4- 

ob": 'voir annexe 6 
90 ad=&4760:lign=170 

100 ctrl=0:READ c$:IF c$="fin" THEN 240 
110 FDR i=l TO LENCc*) STEP 2 
120 c=VAL<"Se"+MID*<c*,i ,2) ) 
130 POKE ad,c:ad=ad+lsctrl=ctrl+c 
140 NEXT:READ teste: IF testeOctrl THEN PRINT"Er 

rear DATA 1 igne"lign:END 
150 lign=lign+10:GOTO 100 

160 ' 

170 DATA 2AA045ED5B9C453AA74547C5E53AA645477E0FC 

D, 2325 

180 DATA AB47CB5FC287471AE6AACA87474F7EE655B1777 

E, 2713 

190 DATA CDA847CB5FC29C471AE655CA9C474F7EE6AAB17 

7, 2834 
200 DATA 231310D1E1CD26BCC110C4C94F3E00CB29D2B24 

7, 2385 
210 DATA 3E08CB29CB29D2BB47C602CB29CB29D2C447C60 

4, 2393 



GESTION OBJETS SUR DECOR I 205 

223 DATA CB29CB29D03CC90000000000000000000000000 

0, 957 
230 DATA "fin" 
240 MODE 
250 LOAD"image.bin" ,&C000: 'chargement du decor, 

optionnel 
260 FOR 1=0 TO 15 

270 INK I,ASC(MID^("ACLFSPGJaCJXSDZQ M ,1+1,1) )-65 
280 'INK I,ASC<MID$("AMTQSVSJRLJXSRYQ",I+1,1) >-6 

5 pour monochrome 
290 NEXT 

300 LOAD"dessins" ,&3000 
310 FOR i=l TO 6 
320 c=&3000-*-(i-l)*(7-*10) 
330 bu-f (i , 0) =c -256*1 NT <c/256) : buf (i , 1 ) =INTCc/256 

) 
340 NEXT 
350 POKE &45A6,7 
360 POKE &45A7,10 
370 ' 
330 ad=51369:POKE &45A0,ad-256*INT (ad/256) : POKE 

&45A1 f INT (ad/256) 
390 POKE &459C,0:POKE &459D , &B0 : CALL &4730:'init 

- sauvegarde decor 
400 ' 

410 FOR p=l TO 6 

420 POKE St459C f 0:PQKE &459D , &B0 : CALL &47B0 
430 CALL &4C00: 'deplacement 
440 CALL &473B 

450 POKE &459C,bu-f (p,0) : POKE &459D ,bu-f <p, 1 > 
460 CALL &4760:FOR i = l TO 10: NEXT s CALL &BD19 
470 NEXT 
4B0 GOTO 410 



Modifications de 7.6 pour 7.6b 



300 LOAD " dessi nsB " , &300O 

320 c=&3000+<i-l)» (13*33) 

350 POKE &45A6,13 

360 POKE &45A7,33 

380 ad=51369:P0KE &45A0, ad-256*INT (ad/256) sPOKE 

&45A1, INT (ad/256) 
390 POKE &459C,0:POKE &459D , &S0 s CALL &4730:'init 

- sauvegarde decor 
420 POKE &459C,0:POKE &459D,&S0:CALL &470O 



206 I GRAPHEMES EN ASSEMBLEUR SUR AMSTRAD 
Modifications de 7.6 pour 7.6c 

30.4 0.4 

300 LOAD"dessinsC" ,&3000 

320 c=&3000+<i-i>*< 19*21) 

340 NEXT 

350 POKE &c45A6,21 

360 POKE &45A7.19 

380 ad=5 1369: POKE &45A0,ad-256*INT Cad/256) : POKE 

&45A1 , INT (ad/256) 
390 POKE &459C,0=POKE &459D , &B0 : CALL &4730: 'init 

- sauvegarde decor 
420 POKE &459C,0:POKE &459D , &80 : CALL &47B0 



Enfin, bien que les points soient d^sormais trait6s individuellement, 
I'objet ne peut toujours se d6placer que d'un octet au minimum, soit deux 
points. Pour obtenir un deplacement point par point il faut choisir Tune des 
deux solutions suivantes : 

- soit doubler le nombre de dessins pour un objet, afin d'obtenir des 
phases d6cal6es par des points et non des ensembles de 2 points ; 

- soit refaire les routines pourtraiter les differents cas de figure (dessin sur 
un point de gauche d'un octet, et dessin sur un point de droite). 

Toutefois, la majorite des travaux se contentent d'un traitement par 
octets et non par points. 



SYSTEME 
DE COORDONNEES 



8 






208 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 

QUEL SYSTEME DE COORDONNEES ? 



Les chapitres precedents nous ont permis de maitriser la restitution 
visuelle des objets graphiques. Le chapitre 6 nous a meme appris a 
modifier I'emplacement d'un objet a I'ecran en fonction du mouvement 
demande par le joystick. Mais le plus gros de la gestion des objets reste a 
faire. En effet, nous n'avons pour I'instant aucun moyen simple de 
connaitre I'endroit de I'ecran ou se situe I'objet, par exemple par rapport a 
un mur. La seule solution semble passer par son adresse de visualisation. 
£tant donne la structure de I'ecran, les calculs risquent de devenir 
cauchemardesques. 

II faut done recourir a un syst^me de coordonnees fictives, e'est-a-dire 
que la position de I'objet ne sera plus memorisee simplement par son 
adresse en memoire ecran, mais egalement par deux coordonnees X et Y, 
celles-ci etant modifiees lors des deplacements. Ces coordonnees ne 
joueront aucun role dans la restitution de I'objet h I'ecran. En revanche, 
elles nous permettront de detecter les collisions avec des elements de 
decor, des murs, d'autres objets, cela en comparant simplement les 
coordonnees de I'objet a deplacer et celles des obstacles possibles. Nous 
pourrons alors, en fonction du resultat de? tests, decider ou non d'inhiber 
le deplacement souhaitd (schema 8.1 v. p. 209). 

Le systeme de coordonnees utilise est directement lie a I'ecran utilise. Si 
celui-ci est int6gralement pris, nous pourrons par exemple opter pour ce 
qui suit : 

- les abscisses iront de (a gauche, premier octet sur une ligne) a 79 
(dernier octet a I'extr&me droite) ; 

- Les ordonnees iront de (en haut de I'ecran) a 199 (en bas). 

Dans ce cas, il sera simple, par exemple, d'interdire une sortie de l'6cran, 
grace a la sequence suivante : 

- retenir les anciennes coordonnees X et Y ; 

- calculer les nouvelles d'apres le deplacement souhaite ; 

- si x<0 ou x>79 ou y<0 ou y>199, restituer les anciens X et Y et fin du 
travail ; 

- sinon, memoriser ces nouvelles coordonnees et afficher I'objet a son 
nouvel emplacement en effagant I'ancien. 



TERRITOIRES INTERDITS ET COLLISIONS 



On peut egalement interdire certains endroits de I'ecran par ce meme 
principe. Le schema 8.1 montre par exemple une zone interdite. La zone en 
question peut ais£ment etre codee dans une table qui resume les points 



SYSTEME DE COORDONNEES I 209 




210 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 

interdits. Par une suite de tests (verifiant qu'aucun des points n'est 
identique a la nouvelle position), on peut savoir si I'objet cherche a 
empieter sur la zone interdite. 

Ce procede a un inconvenient : il est lent et encombrant. Une serie de 
tests risque de ralentir les calculs de fagon significative, et il faudra 2 octets 
de codage pour chaque point interdit. II existe une fagon plus simple de 
proceder : on decoupe la zone en rectangles, et on ne retient que les quatre 
donnSes caract6risant chaque rectangle : le X de gauche et la largeur, le Y 
du haut et la hauteur. 



Deplacement par coordonnees 



Bien entendu, la gestion de coordonnees suppose une modification de ia 
routine de calcul d'adresse ecran. Lorsque nous effectuons un deplace- 
ment, il faut remettre a jour X et Y. Le programme en assembleur 8.1 est 
done une mise a jour du programme 6.1. II ajoute uniquement une 
modification de X et Y dans les sous-routines HAUT, BAS, GAUCHE et 
DROITE de deplacement 6l6mentaire. 



45A0 
45AA 
45AB 

489C 

4B9C CD24BB 

489F 2AA045 

48A2 CDA948 

48A5 22A845 

48A8 C9 

48A9 E60F 

4BAB 17 

48AC 5F 

48AD 1600 



EQU 
EQU 
EQU 



I45A0 
I45AA 
I45AB 



10; 

20 ;Prograflme de deplaceraent par joystick 

30 ; Entree: 

40 ; la variable ECRAN contient 1'adresse ecran 

50 ; a recalculer en function de l'etat du joystick 

60 ; et X et Y les coordonnees de I'objet. 

70 ; programme 8.1, reaake 6.1 

80; 

90 ECRAN: 
100 X: 
110 Y: 
120 ; 
130 
140 
150 
160 
170 
180 
190 ; 

200 DEPLACi 
210 
220 
230 



ORB H89C 
CALL IBB24 
LD HL, (ECRAN) 
CALL DEPLAC 
LD (ECRAN) ,HL 
RET 



AND 
RLA 
LD 

LD 



#0F 

E,A 
D,0 



;get joystick state 



;garde 4 bits de droite 
;aultiplie par deux 

jtransfert de 1 'offset 16 bits 
dans DE 



48AF DD21C048 240 



LD IX.TABLE 



SYST&ME DE COORDONNEES I 211 



48B3 DD19 


250 


ADD 


IX, DE 


;calcul localisation de 

l'adresse de saut 


48B5 DD5EB0 


260 


LD 


E,(IX+0) 




48B8 DD5601 


270 


LD 


D,(IX+1) 


jrecupere adresse de saut 
dans DE 


48BB D5 


280 


PUSHDE 




48BC DDE1 


290 


POP 


IX 


jtransfert dans IX 


48BE DDE9 


300 
310 ; 


JP 


(IX) 


;et saut a la routine 




320 ;la table de saut 






330 ; 








4BC0 2F49 


340 TABLE; 


i DEFWNOP 




48C2 F148 


350 


DEFW HAUT 




48C4 E048 


360 


DEFW BAS 


. 


48C6 2F49 


370 


DEFWNOP 




48C8 0549 


380 


DEFW GAUCHE 




48CA 1749 


390 


DEFW DIAG1 




48CC 1D49 


400 


DEFW DIA82 




48CE 3549 


410 


DEFW 6AUCHE 




48D0 0E49 


420 


DEFW DRQITE 




48D2 2349 


430 


DEFW DIAG3 




48D4 2949 


440 


DEFW DIA64 




48D6 3E49 


450 


DEFW DROITE 




48D8 2F49 


460 


DEFW NOP 




48DA F148 


470 


DEFW HAUT 




48DC E048 


480 


DEFW BAS 




48DE 2F49 


490 


DEFWNOP 






500 ; 










510 ;les i 


juatres deplacements 


elemental res 




520 i 








48E0 3AAB45 


530 BAS: 


LD 


A,(Y) 




48E3 3C 


540 


INC 


A 




48E4 32AB45 


550 


LD 


(Y),A 




48E7 1 10088 


560 


LD 


DE,»800 




48EA 19 


570 


ADD 


HL,DE 




48EB D0 


580 


RET 


NC 


;toujouT5 dans l'ecran 


48EC 1150C0 


590 


LD 


DE,#C050 




48EF 19 


600 


ADD 


HL,DE 




48F0 C9 


610 
620 ; 


RET 






48F1 3AAB45 


630 HAUT: 


LD 


A,(Y) 




48F4 3D 


640 


DEC 


A 




4BF5 32AB45 


650 


LD 


(Y),A 




48F8 1100F8 


660 


LD 


DE,tF800 




48FB 19 


670 


ADD 


*L,DE 




48FC 7C 


680 


LD 


A,H 




48FD FEC0 


698 


CP 


tea 




48FF D0 


7(90 


RET 


NC 


jtoujours dans l'ecran 


4908 11BB3F 


710 


LD 


DE,#3FB0 





212 I GRAPHEMES EN ASSEMBLEUR SUR AMSTRAD 



4903 


19 


720 


ADD 


HL,DE 


4904 


C9 


730 

740 ; 


RET 




4905 


2B 


750 6AUCHE 


DEC 


HL 


4906 


3AAA45 


760 


LD 


A,(X) 


4909 


3D 


770 


DEC 


A 


490A 


32AA45 


780 


LD 


(X),A 


490D 


C9 


790 
800 ; 


RET 




490E 


23 


810 DROITE 


INC 


HL 


490F 


3AAA45 


820 


LD 


A,(X> 


4912 


3C 


830 


INC 


A 


4913 


32AA45 


840 


LD 


(X),A 


4916 


C9 


850 
860 ; 


RET 








870 jles quatres 


diagon 






880 ; 






4917 


CD0549 


890 DIAG1: 


CALL GAUCHE 


491A 


C3F148 


900 
910 j 


JP 


HAUT 


491D 


CD0549 


920 DIA62: 


CALL GAUCHE 


4920 


C3E048 


930 
940 ; 


JP 


BAS 


4923 


CD0E49 


950 DIA63: 


CALL DROITE 


4926 


C3F148 


960 
970 ; 


JP 


HAUT 


4929 


CD0E49 


980 DIAG4: 


CALL DROITE 


492C 


C3E048 


990 
1000 ; 
1010 ;RIEN 
1020 ; 


JP 


BAS 


492F 


C9 


1030 NOP: 


RET 




Pass 2 errors: 


00 







Le mode d'emploi en est le m§me que la routine 6.1 : on envoie dans A 
un code de deplacement (le plus souvent, l'6tat du joystik), et dans le 
registre HL I'adresse originate d'affichage de I'objet. Ensuite, on appelle 
DEPLAC (adresse $48A9). Le retour se fait avec les variables X, Y et HL 
remises a jour. Le petit programme au d6but du listing (adresses $489C a 
$48A8) est destine £ ('utilisation sous Basic de la routine : il appelle I'etat de 
joystick, place I'adresse ecran dans HL, et execute la routine proprement 
dite. Ensuite, il remet a jour la variable ECRAN. Vous pouvez utiliser le 
programme 8.1 Basic pour observer la remise a jour des coordonnees (il 
s'agit bien entendu du programme 6.1 modifie pour la circonstance). 



SYSTEME DE COORDONNEES I 213 

20 '** Programme S- 1 ** 
30 ' ******■*******#***-*-** 

40 ' 

50 'deplacement d'un objet en plusieurs phases 

60 'd'apres le codage e-f-fectue par programme 4-3 

70 'aux adresses $2-f-f-f et suite. 

80 ' 

90 MEMORY &2FFF 

100 L0AD"prog4. lob" : 'voir annexe 6 

110 ' 

120 ad=&4S9C:lign=200 

130 ctrl=0:READ c$: IF c$="Fir." THEN 290 

140 FOR i = l TO LEN(c^) STEP 2 

150 c=VAL("£c"+MID:£(c£,i,2) ) 

160 POKE ad,c:ad=ad+l:ctrl=ctrl+c 

170 NEXT: READ teste: IF testeOctrl THEN PRINT"Er 

reur DATA 1 i gne " 1 i gn : END 
180 lign=lign+10:GOTO 130 

190 ' 

200 DATA CD24BB2AA045CDA94822A045C9E60F175F1600D 

D, 2215 
210 DATA 21C04SDD19DD5E00DD5601D5DDE1DDE92F49F14 

8, 2712 

220 DATA E0482F49054917491D4905490E49234929490E4 

9, 1166 

230 DATA 2F49F148E04S2F493AAB453C32AB45ii000819D 

0, 1755 
240 DATA 1150C019C93AAB453D32AB451100FB197CFEC0D 

, 2232 

250 DATA 11B03F19C92B3AAA453D32AA45C9233AAA453C3 

2, 1815 
260 DATA AA45C9CD0549C3F148CD0549C3E048CD0E49C3F 

1, 2733 

270 DATA 48CD0E49C3E048C900000000000000000000000 

0, 1056 
280 DATA "-fin" 
290 MODE 
300 LOAD "image. bin" ,&C000: 'chargement du decor , 

optionnel 
310 FOR 1=0 TO 15 

320 INK I ,ASC (MID* ("ACLFSPBJOLJXSDZQ", 1+1,1) > -65 
330 'INK I,ASC(MID*( ,, AMTQSVSJRCJXSRYQ" ,1 + 1,1) >-6 

5 pour monochrome 
340 NEXT 

350 ecr=5132B:x=&30:y=7 
360 POKE &45A0,ecr-256*INT(ecr/256) :POKE &45A1,I 

NT(ecr/256) 
370 POKE &45AA,x=POKE &45AB,y 



214 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAO 

330 POKE &45A6.7:' largeur en qc 

tets 

390 POKE &45A7,10:' hauteur en n 

ombre de lignes 
400 LOAD"dessins" ,&3000 
410 FOR phase=l TO 6 

420 bu-f (phase) =&3000+ (phase-1) * (7*10) 
430 NEXT 
440 ' 

450 FOR phase=l TO 6 
460 POKE &459C,buf (phase) -256*INT (buf (phase)/256 

):POKE &459D,INT(buf (phase)/256) 
470 FOR k=l TO 4 
480 CALL &489C 

490 LOCATE i,24:PRINT"X : " ; PEEK (&45AA) ; " - Y :"; 

PEEK ( 8c45 AB) 
500 CALL &4700 
510 NEXT 
520 NEXT 
530 GOTO 450 



Modifications de 8. 1 pour 8. lb 



350 ecr=5i328:x=&30:y=7 

380 POKE Sc45A6,13: ' largeur en o 

ctets 
390 POKE &45A7,33:' hauteur en n 

ombre de lignes 
400 LOAD "dessinsB" ,&3000 
420 buf (phase) =&3000+ (phase-!)* (13*33) 



Modifications de 8. 1 pour 8. 1c 

350 ecr=5132S:x=&30:y=7 

370 POKE &45AA,x:P0KE &45AB,y 

3B0 POKE &45A6,2i=' largeur en o 

ctets 
390 POKE &45A7.19:' hauteur en n 

ombre de lignes 
400 LOAD-'dessinsC" ,Sc3000 
420 buf (phase) =&3000+ (phase-!)* (21*19) 



SYSTEME DE COORDONNEES I 215 

La gestion simple de coordonnees est done la suivante : 

□ initialisation de I'adresse ecran et des coordonnees de depart ; 

□ memorisation du decor de I'emplacement initial. 

(1) mise en place des variables de travail X,Y,LAR,HAU,ECRAN,BUF. 
• Si deplacement demande : 

- appel de la routine 8.1 DEPLAC ; 

- test des territoires interdits (bords de I'ecran compris) ; 

- si deplacement valide : 
remise en place du decor ; 

remise a jour reelle de X,Y et ECRAN ; 
memorisation du decor du nouvel emplacement ; 
affichage de I'objet sur le decor (gestion des avant-pians par la 
routine 7.3) ; 

□ continuer programme ; 

□ lorsque le reste du travail est termine, on recommence en (1). 

La gestion des decors ecrases et des differents graphismes d'affichage 
de I'objet doit etre independante des deplacements. En effet, il taut une 
zone de sauvegarde de d6cor par objet en mouvement, et il faut remettre a 
jour les variables ECRAN, BUF, BUFFER, X, Y, LAR et HAU pour chaque 
objet g6re ainsi. II s'agit simplement de chargements en memoire, ce n'est 
guere complique. II nous reste a programmer la routine s'occupant des 
territoires interdits et des collisions entre objets. 



Collisions 

Chaque objet est code dans un rectangle dont nous connaissons les 
caracteristiques. Une collision entre deux objets correspond done a une 
intersection non vide des deux rectangles. La procedure a suivre, pour 
savoir si cette intersection est vide, est simple. Elle est constitute de quatre 
tests. S'ils sont tous verifies, il y a recouvrement, si I'un des quatre n'est 
pas verifie, les rectangles ne sont pas en contact. Ces quatre tests 
fonctionnent quels que soient les cas de figure (v. schema p. 216). 



216 I GRAPHEMES EN ASSEMBLEUR SUR AMSTRAD 



©- 



Yl 
Y+hau 



Y1+hau1 



© 



X+LAR 



X1 + LAR1 



0BJET1 



>X 



0BJET2 



CONTACT 


XKX+LAR 

ET 


X1-X 


<LAR 




X<X1 + LAR1 


X-X1 


<LAR1 




ET 








YKY-fHAU 


Y1-1 


<HAU 




ET 








Y<Y1 + HAU1 


Y-Y1 


<HAU1 


Schema 8.2 






Colli 



Collision entre objets. 



La programmation de la routine est simple si on utilise une zone de 
variables particuliere. En l'occurrence, les variables X, Y, LAR, HAU, X1, Y1, 
LAR1 et HAU1 sont placeesa partir de$45A8, dans des octets successifs. Le 
registre IX contenant $45A8, on utilise I'adressage pseudo-indexe pour 
acceder facilement a chacune des huit variables. Cette routine est I'occa- 
sion de constater la puissance de ce type d'adressage. Chaque case 
memoire accessible par (IX+d) peut etre assimilee a un registre, ce qui 
permet de I'ajouter a A, de le modifier et de le comparer h A tres 
simplement. 



SYSTEME DE COORDONNEES I 217 

18 } 

20 ;routine de detection de collision entre objets 

30 ; programme 3.2 

40; 

50 ;ENTREES: les variables X, Y, LAR et HAU definissent le premier 

60 ; objet graphique. 

70 ; Xl,Yl,LARi,HAUl definissent le second. 



45AS 




90 X: 


EQU 


#45A8 


45A9 




100 Y: 


EQU 


#45A9 


45AA 




110 LAR: 


EQU 


#45AA 


45AB 




120 HAU: 


EQU 


845AB 


45AC 




130 XI: 


EQU 


845AC 


45AD 




140 Yl: 


EQU 


#45AD 


45AE 




150 LAR1: 


EQU 


#45AE 


45AF 




160 HAU1: 


EQU 


S45AF 


45B0 




170 COLLI: 
180 ; 


EQU 


#45B0 


4950 




190 


ORG 


#4950 


4950 


DD21A845 


200 


LD 


IX, X 


4954 


DD360800 


210 
220 ; 


LD 


(IX+8),0 






230 ; ler test XI 


<X+LAR ? 






240 ; 






4958 


DD7E00 


250 


LD 


A,(IX+0) 


495B 


DD8602 


260 


ADD 


A,(IX+2) 


495E 


4F 


270 


LD 


C,A 


495F 


DD7E04 


280 


LD 


A,(IX+4) 


4962 


B9 


290 


CP 


C 


4963 


DB 


300 
310 ; 


RET 


NC 






320 ;2e test X<X1+LAR1 






330 ; 






4964 


DD7E04 


340 


LD 


A,(IX+4> 


4967 


DD8606 


350 


ADD 


A,UX+6) 


496A 


4F 


360 


LD 


C,A 


496B 


DD7E00 


370 


LD 


A,(IX+0) 


496E 


B9 


380 


CP 


C 


496F 


DB 


390 
400 ; 


RET 


NC 






410 jler test YKY+HAU 






420 ; 






4970 


DD7E01 


430 


LD 


A,(IX+1) 


4973 


DD8603 


440 


ADD 


A,(IX+3) 


4976 


4F 


450 


LD 


C,A 


4977 


DD7E85 


460 


LD 


A,(IX+5) 


497A 


B9 


470 


CP 


C 


497B 


m 


480 
490 : 


RET 


NC 



;par detaut, pas de contact 



•A=X 
■A=X+LAR 

;par rapport a XI ? 

;pas de contact, X+LAR<=XL 



;A=X1 
;A=XHLAR1 



jcofflpare a X ? 

ipas de contact, X1+LARK=X 



;A=Y 

;A=Y+HAU 



;Y+HAIKY1 ? 

;oui, pas de contact 



218 I GRAPHEMES EN ASSEMBLEUR SUR AMSTRAD 



500 ;2e test Y<Yi+HAUl 



518 ; 



497C DD7E05 


528 


LD A,(IX+5> 


;A=Y1 


497F DD8607 


530 


ADD A,UX+7) 


;A=Y1+HAU1 


4982 4F 


540 


LD C,A 




4983 DD7E01 


550 


LD A,(IX+1) 




4986 B9 


560 


CP C 


;Y1+HAU1<Y 7 


49B7 D8 


570 
580 ; 


RET NC 


;oui:pas de contact 




590 (11 


y a collision, les quatres 


tests sont veri-fies. 




680 ; 






4988 DD3608FF 


610 


LD (IX+8),#FF 


jpositianne COLLI 


49BC C9 


620 


RET 




Pass 2 errors; 


00 







Cette routine compare les deux rectangles characterises par les 8 varia- 
bles. Nous allons maintenant I'utiliser pour savoir si un objet se place sur 
un territoire interdit ou non. Pour cela, nous allons supposer que le 
programme appelant fournit deux types de donnees : 

□ celles de I'objet dans les nouvelles variables X/Y, LAR et HAU ; 

□ I'adresse de la table des territoires interdits, dont le contenu est le 
suivant : 

• X territoirel 

• Y territoirel 

• largeur territoire 1 

• hauteur territoire 1 

• X territoire 2 

• Y territoire 2 

• largeur territoire 2 

• hauteur territoire 2 

• ... ainsi de suite pour chaque territoire interdit ... 

• $FF pour indiquer la fin de la table. 

La routine 8.3 s'occupe des tests. En fin de travail, la variable COLLI 
contient $FF si un contact a ete trouve, et sinon. 



A5A9 
45AA 



10; 

20 ;prograffiffle d' interdiction de zones 

30 ; programme 8.3 

40 jutilise la routine 8.2 afin de tester les zones 

50; 

60 X: EQU S45A8 

70 Y: EQU *45A9 

80 LAR: EQU S45AA 



SYSTtME DE COORDONN£ES I 21S 



45AB 


90 HAU: 


EGU 


#45AB 




45AC 


100 XI: 


EQU 


#45AC 




45AD 


110 Yl: 


EQU 


#45AD 




45AE 


120 LARi: 


EQU 


#45AE 




45AF 


138 HAU1: 


EGU 


845AF 




45B0 


140 COLLI: 


EGU 


#45B0 




45B1 


150 TABLE: 
160 ; 


EQU 


#45B1 


jadresse table des zones 
interdites 


49A0 


170 

180 ; 


ORB 


S49A0 




49A0 2AB145 


190 


LD 


HL, (TABLE) 


;adresse table dans HL 


49A3 AF 


200 


XOR 


A 


;A=0 


49A4 32B045 


210 

220 ; 


LB 


(COLLI), A 


;aise a flag de collision 


49A7 7E 


230 LOOP: 


LD 


A, (ft) 


;ier octet 


49A8 FEFF 


240 


CP 


SFF 


jfin de table ? 


49AA C8 


250 


RET 


Z 


;oui: teriine avec succes, 
COLLI reste a zero 


49AB 32AC45 


260 


LD 


(XI), A 




49AE 23 


270 


INC 


HL 




49AF 7E 


280 


LD 


A,(HL) 




49B0 32AD45 


290 


LD 


(Y1),A 




49B3 23 


300 


INC 


HL 




49B4 7E 


310 


LD 


A,(HL> 




49B5 32AE45 


320 


LD 


(LARD, A 




49B8 23 


330 


INC 


HL 




49B9 7E 


340 


LD 


A,(HL) 




49BA 32AF45 


350 


LD 


(HAU1),A 




49BD 23 


ZUd 


IMC 


\L 


jdonnees transaises en tant 
qu'objet 2 


49BE E5 


370 


PUSH HL 


;sauve pointeur table 


49BF CD5049 


380 


CALL 84950 


;test de collision (prog 8. 


49C2 El 


390 


POP 


HL 


jrecupere pointeur 


49C3 3AB045 


400 


LD 


A, (COLLI) 


; test de colli 


49C6 B7 


410 


OR 


A 


;positionne on non ? 


49C7 C0 


420 


RET 


NZ 


;oui: fin du travail 


49C8 C3A749 


430 


JP 


LOOP 


jtester autres territaires 
de la table. 


Pass 2 errors: 


00 









220 I GRAPHEMES EN ASSEMBLEUR SUB AMSTRAD 

ROUTINE DE DEPLACEMEIMT AUTOMATIQUE 



La mise en ceuvre de la routine ne pose pas de probleme particulier ; elie 
suit 1'algorithme decrit plus haut. Le programme Basic 8.3 montre ce 
d§roulement des operations. 



10 ' ******************** 
2® '*-* Programme 3.3 ** 
30 ' ******************** 

40 ' 

50 'deplacement d'un objet avec caordonnees et t 

err itoi res interdits. 
60 ' 

70 MEMORY &2FFF 
80 L0AD l, prog8. lob" : LQAD"prag4. lab": 'voir annexe 

6 

90 LOAD"prog4.2ob" :L0AD"prog7.4ab": 'voir annexe 

6 

100 ad=&4950:lign=lB0 

110 ctrl=0:READ c*: IF c$="-fin" THEN 240 

120 FOR i=l TO LENCcS) STEP 2 

130 c=VAL("&"+MID$(c$,i,2) ) 

140 POKE ad,c:ad=ad+l:ctrl=ctrl+c 

150 MEXT:READ teste: IF testeOctrl THEN PRINT"Er 

reur DATA 1 igne"l ignsEND 
160 lign=lign+10s6OTO 110 

170 ' 

180 DATA DD21AB45DD360800DD7E00DD86024FDD7E04B9D 

0, 2301 
190 DATA DD7E04DDS6064FDD7E00B9D0DD7E01DDB6034FD 

D f jc_^j-j7 
200 DATA 7E0539D0DD7E05DD86074FDD7E01B9D0DD360BF 

F, 2596 

210 DATA C9, 201 






DATA -fin 



230 ' 

240 ad=&49A0:lign=320 

250 ctrl=0:READ c$: IF c^="fin" THEN 370 

260 FOR i=l TO LEN<c$) STEP 2 

270 c=VAL<"&"+MID$<c$,i,2) ) 

280 POKE ad,c:ad=ad+l:ctrl=ctrl+c 

290 IMEXT:READ teste: IF testeOctrl THEN PRINT"Er 

reur DATA 1 igne"! ignsEND 
300 lign=lign+10:GOTO 250 
310 ' 



SYSTEME DE COORDONN^ES I 221 

320 DATA 2AB145AF32B0457EFEFFCS32AC45237E32AD452 

3, 2372 
330 DATA 7E32AE45237E32AF4523E5CD5049E13AB045B7C 

0, 2399 
340 DATA C3A749, 435 
350 DATA fin 
360 ' 

370 MODE 
3B0 LOAD"image..bin" ,&C000: 'chargement du decor, 

optionnel 
390 FOR 1=0 TO 15 
400 ' INK I , ASC (MID* ( "ACLFSPGJOt JXSDZQ" » 1+1 f I > > -6 

5: 'pour couleur 
410 INK I,ASC(MID*("AriTDSVSJRLJXSRYQ",I+l,l))-65 

2 ■ pour monochrome 
420 NEXT 

430 LOAD" d ess ins" ,&3000 
440 FOR phase=l TO 6 

450 buf (phase) =&3000+ (phase-1 ) * (7*10) 
460 NEXT 
470 ' 
480 'initialisations variables 

490 ' 

500 k=0s y=170: ecran=528S0 

510 lar=7shau=10 

520 POKE &45A6 , 1 ar : POKE &45A7,hau 

530 POKE &45A0,ecran-256*INT(ecran/256) :POKE &45 

Al , INT (ecran/256) 
540 POKE &459C,0:POKE &459D,&37 
550 CALL &4730: 'memorise premier decor 
560 colli=&45B0:table=&37F0 
570 POKE &45B1,&F0:POKE &45B2,&37 
580 POKE tab le,0: POKE table+1,0 
590 POKE table+2,B0:POKE table+3,74 
600 POKE table+4,65:P0KE table+5,165 
610 POKE table+6,15:P0KE table+7,35 
620 POKE table+8,&FF: 'fin table des territoires 

interdits 
630 ' 

640 FOR phase=l TO 6 
650 ecran2=ecran 
660 POKE &45AA,x:P0KE &45AB,y 
670 CALL &489C: 'deplacement demande 
680 IF PEEK(&45AA)=x AND PEEK (&45AB) =y THEN 800: 

'pas de deplacement 
690 IF PEEK (&45AA) >S0-1 ar THEN 800: 'sortie ecran 

inter di te 
700 IF (FEEK(&45AB)>199> OR (y=0 AND PEEKC&45AB) 

>127) THEN 800: 'sortie ecran 



222 I GRAPHEMES EN ASSEMBLEUR SUR AMSTRAD 

710 POKE &45A8,PEEK(&45AA) 

720 POKE &45A9,PEEK(&45AB> 

730 POKE fc45AA,lar 

740 POKE &45AB,hau 

750 CALL &49A0: 'test territoires interdits 

760 IF PEEK (col li)<>0 THEN 800s 'interdit 

770 ' depl acement val i de 

780 x=PEEK (&45A8) : y=PEEK (&45A9) 

790 ecran2=PEEK (&45A0) +256*PEEK (&45A1) 

800 POKE &45A0,ecran-256*INT(ecran/256) : POKE Sc45 

Al,INT(ecran/256) 
810 POKE &459C,0:POKE &459D,&37 
820 CALL &470B: 'remise en place decor 
830 ecran=ecran2 

840 POKE &45A0,ecran-256*INT(ecran/256):POKE &45 

Al,INT(ecran/256) 
850 CALL &4730: 'memorisation nouveau decor 
860 c=bu-f (phase) s POKE &459C,c-256*INT(c/256> s POK 

E &459D,INT(c/256) 
870 CALL &4760: 'dessin objet, avant-plan et fond 

880 * 

890 POKE &45A0,ecran-256-*INT(ecran/256) : POKE &45 

Al ,INT(ecran/256) 
900 NEXT 
910 GOTO 640 



Modifications de 8.3 pour 8.3b 

430 LOAD"dessinsB" ,&3000 

450 bu-f (phase) =£3000+ (phase-i ) * ( 13*33) 

500 x=0:y=170:ecran=52880 

510 lar=13shau=33 

540 POKE &459C,0:POKE &459D,&80 

560 calli=&45B0:table=&8200 

570 POKE &45Bl f &0 sPOKE &45B2,&82 

810 POKE Sc459C,0:PQKE &459D.&80 



Modifications de 8.3 pour 8.3c 

430 LQAD"dessinsC" ,&3000 

450 buf (phase) =&3000+ (phase-1 ) * (21*19) 

500 x=0: y=170:ecran=52S80 

510 lar=21:hau=19 

540 POKE &459C,0:POKE &459D,&80 

560 colli=&45B0: table=Sc8200 

570 POKE &45Bl f &0:PQKE &45B2 f &82 

310 POKE &459C,0:PQKE &459D,&30 






SYSTEME DE COORDONN£ES I 223 

Le joystick deplace le module a l'inte>ieur de l'6cran. Vous pouvez 
egalement remarquer que I'arbre situe sur le sol est integre au decor (le 
module passe devant), tandis que celui situe plus bas est un avant-plan : le 
module passe derriere. Cela est du a la routine de restitution d'objets avec 
avant-plans. II suffit simplement de tracer I'arbre avec les stylos 8 a 15 pour 
qu'il fasse partie du premier plan. 

Nous sommes sur le chemin d'une gestion automatique des objets et des 
decors. Mais, malgre tout, le programme Basic 8.3 est un condense de 
POKE, PEEK et CALL De plus, il est extremement lent. Pour remedier a cela, 
il nous suffit de transposer la partie finale de ce programme en assembleur. 
C'est le but de la routine 8.4. 







10; 










219 ; programme de deplaceraant 






30 ; programme 8.4 






40 ; 






45B3 




50 XQ: 


EQU 


S45B3 


45B4 




60 YO: 


EQU 


I45B4 


45A6 




70 LARO: 


EQU 


S45A6 


45A7 




80 HAUO: 


EQU 


I45A7 


459C 




90 BUF: 


EQU 


#459C 


45B9 




100 BUFFER: 


EQU 


#45B9 


45BB 




110 DESSIN- 


EQU 


#45BB 


45BD 




120 JQYST: 


EQU 


#45BD 


45A0 




130 ECRAN: 


EQU 


S45A0 


45B5 




140 ECRAN0: 


EQU 


#45B5 


437 




150 ECRAN2 


EQU 


845B7 


45A8 




160 X: 


EQU 


t45A8 


45A9 




170 Y: 


EQU 


845A9 


45AA 




180 LAR: 


EQU 


«45AA 


45AB 




190 HAU: 


EQU 


#45AB 


45AC 




200 XI: 


EQU 


845AC 


45AD 




210 Yl: 


EQU 


#45AD 


45flE 




220 LAR1: 


EQU 


#45AE 


45AF 




230 HftUl: 


EQU 


#45AF 


430 




240 COLLI: 
250 ; 


EQU 


845B0 


4A0B 




260 


ORG 


MA00 


4A00 


2AA845 


270 


LD 


HL, (ECRAN) 


4A03 


22B545 


280 


LD 


(ECRAN0) ,HL 


4A06 


22B745 


290 


LD 


(ECRAN2) ,HL 


4A89 


3AB345 


300 


LD 


A,(XQ) 


4A3C 


32AA45 


310 


LD 


(LAR), A 


4A8F 


3AB445 


320 


LD 


A, (YO) 


4A12 


32AB45 


330 


LD 


(HAU), A 



;retenir ancienne pos ecran 
;nouvelle pos par defaut=la 
•OK 



224 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 



4A15 


3ABD45 


340 


LD 


A, (JQYST) 


4A18 


B7 


350 


OR 


A 


4A19 


C2224A 


360 


JP 


NZ, PASJOY 


4A1C 


CD9C48 


370 


CALL 8489C 


4A1F 


C32B4A 


380 


JP 


SUITE1 


4A22 


2AA045 


390 PASJOY 


: LD 


HL,(ECRAN) 


4A25 


CDA948 


4tH 


CALL #48A9 


4A28 


22A045 


410 
420 ; 


LD 


(ECRAN) ,HL 


4A2B 


3AAA45 


438 SUITE1 


: LD 


A, (LAR) 


4A2E 


4F 


440 


LD 


C f A 


4A2F 


3AB345 


450 


LD 


A,(XQ) 


4A32 


B9 


460 


CP 


C 


4A33 


C2414A 


470 


JP 


NZ,SUITE2 


4A36 


3AAB45 


480 


LD 


A, (HAU) 


4A39 


4F 


490 


LD 


C,A 


4A3A 


3AB445 


500 


LD 


A, (YD) 


4A3D 


B9 


510 


CP 


C 


4A3E 


CAA54A 


520 
530 ; 


JP 


Z,SU1TE4 


4A41 


3AAA45 


540 SUITE2; 


: LD 


A, (LAR) 


4A44 


4F 


550 


LD 


C,A 


4A45 


3AA645 


560 


LD 


A, (LARO) 


4A48 


81 


570 


ADD 


A,C 


4A49 


FE50 


580 


CP 


80 


4A4B 


D2A04A 


590 


JP 


NC,SUITE3 


4A4E 


79 


600 


LD 


A,C 


4A4F 


FEFF 


610 


CP 


255 


4A51 


CAA04A 


620 


JP 


Z,SUITE3 


4A54 


3AAB45 


630 


LD 


A, (HAU) 


4A57 


4F 


640 


LD 


C,A 


4A58 


3AA745 


650 


LD 


A,(HAUQ) 


4A5B 


81 


660 


ADD 


A,C 


4A5C 


FEC8 


670 


CP 


200 


4A5E 


D2A04A 


680 


JP 


NC,SUITE3 


4A61 


3AAB45 


690 


LD 


A, (HAU) 


4A64 


FEFF 


700 


CP 


255 


4A66 


D2A04A 


710 


JP 


NC,SUITE3 


4A6V 


3AAA45 


720 


LD 


A, (LAR) 


4A6C 


32A845 


730 


LD 


(X),A 


4A6F 


3AAB45 


740 


LD 


A, (HAU) 


4A72 


32A945 


750 


LD 


(Y),A 


4A75 


3AA645 


760 


LD 


A, (LARO) 


4A76 


32AA45 


770 


LD 


ILAR),A 


4A7B 


3AA745 


780 


LD 


A, (HAUO) 


4A7E 


32AB45 


790 


LD 


(HAU) ,A 


4A81 


CDA049 


800 


CALL #49A0 


4A84 


3AB045 


810 


LD 


A, (COLLI) 


4A87 


B7 


820 


OR 


A 



;pas deplace par joystick 
jdeplacement d'apr8s joystick 



jdeplacefflent automatique 



;deplaceraent sur X ? 
;oui: ok pour suite 



jdeplacement sur y ? 

;non; pas de travail a faire 

;nouvel x 

jtransfere dans C 

jlargeur 

;additionnee 

;bord droit ecran ? 

;oui:pas autonse. 

;trop a gauche ? 

jnouvel y 



;trop en bas ? 

;trop en haut ? 
;nouvel x 

jnouvel y 



;test territoires 



SYSTtME DE COORDONN^ES I 225 



4A8B 


C2A04A 


830 
840 ; 


JP 


N2,SU1TE3 


4A8B 


3AA845 


850 


LD 


A,(X) 


4A8E 


32B345 


860 


LD 


<XQ),A 


4A91 


3AA945 


870 


LD 


A,(Y) 


4A94 


32B445 


880 


LD 


(YQ),A 


4A97 


2AA045 


890 


LD 


hi, (ECRAN) 


4A9A 


22B745 


900 


LD 


(ECRAN2) ,HL 


4A9D 


C3A54A 


910 


JP 


SUITE4 


4MB 


3EB1 


920 SUITE3 


LD 


A,l 


4AA2 


32B045 


930 


LD 


(COLLI), A 


4AA5 


2AB545 


940 SUITE4 


LD 


HL, (ECRAN0) 


4AA8 


22A045 


950 


LD 


(ECRAN) ,HL 


4AAB 


2AB945 


960 


LD 


HL, (BUFFER) 


4AAE 


229C45 


970 


LD 


(BUFi,HL 


4AB1 


CD0047 


980 


CALL #4700 


4AB4 


2AB745 


990 


LD 


HL,(ECRAN2) 


4AB7 


22B545 


1000 


LD 


(ECRAN0) ,HL 


4ABA 


22A045 


1010 


LD 


(ECRAN) ,HL 


4ABD 


CD3047 


1020 


CALL #4730 


4AC0 


2ABB45 


1030 


LD 


HL,(DESSIN) 


4AC3 


229C45 


1040 


LD 


(EUF) ,HL 


4AC6 


CD6047 


1050 


CALL #4760 






1060 ; 






4AC9 


2AB545 


1070 COLLIS 


LD 


HL,(ECRAN0) 


4ACC 


22A045 


1080 


LD 


(ECRAN) ,HL 


4ACF 


C9 


1090 


RET 




Pass 2 errors: 


00 







;il y a eu collision 



; senior ise nouvel x 

jnouvel y 

; ecran recalcule 



;restitution ancien decor 
;ok nouvelle pos ecran 
; memorise nouveau decor 

;dessin de I'objet 



II faut fournir b cette routine les coordonnees de I'objet, sa largeur, sa 
hauteur, son adresse et son adresse ecran initiale. Nous pourrons alors 
demander une gestion automatique du joystick repondant aux criteres 
d6finis plus haut. Une facility a ete ajoutee au programme : si la variable 
JOYST contient une valeur difference de 0, celle-ci est prise en compte a la 
place de l'§tat du joystick, comme si elle en provenait. II s'agit done d'une 
valeur de a 15, indiquant un deplacement selon les regies examinees au 
chapitre 6. Cette facilite permet de mouvoir un objet independamment du 
joystick, en continu ou non. Elle est essentielle car notre routine de 
deplacement automatique peut ainsi etre utilis6e pour des objets n'appar- 
tenant pas au joueur, geres par le programme. 

II convient de noter les variables que le programme appelant doit 
fournir : 

- XO est I'abscisse de I'objet lors de I'appel ; 

- YO est I'ordonnee ; 

- LARD et HAUO sont respectivement la largeur et la hauteur de I'objet ; 



226 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 

- BUFFER est I'adresse de la zone de sauvegarde de decor associee a 
I'objet. Chaque objet doit en effet posseder une zone decor qui lui est 
propre (meme largeur, meme hauteur) ; 

- DESSIN est I'adresse ou se situe le codage du dessin. Cette adresse doit 
etre modiftee soit lorsque Ton change d'objet, soit lorsque celui-ci entre 
dans une nouvelle phase d'animation. Son dessin change alors, indepen- 
damment de toute autre consideration ; 

- JOYST concerne les demandes de deplacement automatique (voir ci- 
dessus). 

Ceci est illustre par le programme Basic 8.4. 

10 ' *********-*-*-***-***•*•■** 

20 '** Programme 8-4 ** 

30 ' ****■**-***•*****-****#* 

40 ' 

50 'deplacement d'un objet avec coordannees et t 

erritoires interdits. 
60 ' 

70 MEMORY &2FFF 
80 L0AD"prog8- lob" : L0AD"prog4- lob": 'voir annexe 

6 
70 LaAD"prog4-2ob":LQAD"prog7.4ob": 'voir annexe 

6 
100 LOAD"proga-2ob , ':LOAD"prog8-3ab M : 'voir annexe 

6 
110 ad=&4A00:lign=190 

120 ctrl=0:READ c$:IF c£="*in" THEN 330 
130 FOR i=l TO LEN(c£) STEP 2 
140 c=VAL<"&"+MID$<c$,i ,2>> 
150 POKE ad,c:ad=ad+i:ctrl=ctrl+c 
160 NEXT; READ teste: IF testeOctrl THEN PRINT"Er 

reur DATA ligne"lign: END 
170 lign=lign+10:GOTQ 120 
180 ' 
190 DATA 2AA04522B54522B7453AB34532AA453AB44532A 

B, 1964 
200 DATA 453ABD45B7C2224ACD9C48C32B4A2AA045CDA94 

S, 2332 
210 DATA 22A0453AAA454F3AB345B9C2414A3AAB454F3AB 

4, 2078 

220 DATA 45B9CAA54A3AAA454F3AA64581FE50D2A04A79F 

E, 2646 
230 DATA FFCAA04A3AAB454F3AA74581FEC8D2A04A3AAB4 

5, 2687 

240 DATA FEFFD2A04A3AAA4532A8453AAB4532A9453AA64 

5, 2416 
250 DATA 32AA453AA74532AB45CDA0493AB045B7C2A04A3 

A, 2283 



SYSTtME DE COORDONNfES I 227 

260 DATA A84532B3453AA94532B4452AA04522B745C3A54 

A, 2121 
270 DATA 3E0132B0452AB54522A0452AB945229C45CD004 

7, 1744 
280 DATA 2AB74522B54522A045CD30472ABB45229C45CD6 

0, 2023 
290 DATA 472AB54522A045C9 , 827 
300 ' 

310 DATA -fin 
320 ' 

330 MODE 
340 LOAD" image -bin" ,&C000: 'chargement du decor, 

optionnel 
350 FOR 1=0 TO 15 
360 'INK I,ABC(MID*("ACLFSPGJ0CJXSDZQ",H-l,l))-6 

5: 'pour couleur 
370 INK I,ASC(MID*C"AMTQSVSJRLJXSRYQ" t I+l,l))-65 

- * pour monochrome 
380 NEXT 

390 LOAD"de5sins",&3000 
400 FOR phase=l TO 6 
410 c=&3000+(phase-l>*(7*10) 
420 bu-f (phase ,0) =c-256*INT (c/256) :buf (phase, 1)=I 

NT(c/256) 
430 NEXT 
440 ' 

450 'initialisations variables 
460 ' 

470 x=0:y=170: ecr an=52880 
480 lar=7shau=10 

490 POKE &45A6 , 1 ar : POKE &45A7,hau 
500 POKE &45A0,ecran-256*INT(ecran/256> :POKE &45 

Al, INT (ecr an/256) 
510 POKE &459C,0:POKE &459D,&37 
520 CALL &4730: 'memorise premier decor 
530 colli=&45B0:table=&37F0 
540 POKE &45B1,&F0:POKE &45B2,&37 
550 POKE table, 0: POKE table+1,0 
560 POKE table+2,80:POKE table+3,74 
570 POKE table+4,65:POKE table+5,175 
580 POKE table+6,15:P0KE table+7,25 
590 POKE table+8,&FF: 'fin table des territoires 

interdi ts 
600 ' 
610 ' 

620 POKE &45B9,0:POKE &45BA,&37 
630 POKE &45B3,x:PQKE &45B4,y 
640 POKE &45BD,0 
650 ' 



228 I GRAPH1SMES EN ASSEMBLEUR SUR AMSTRAD 

660 FOR phase=l TO 6 

670 FOR 1=1 TO 3 

680 POKE &45BB,buf (phase, 0) : POKE &45BC,bu-f (phase 

690 IF PEEK(&45B4)> 50 THEN CALL &BD19 

700 CALL &4A00 

710 IF PEEK(&45B4)<50 THEN CALL &BD19 

720 NEXT 

730 NEXT 

740 GOTO 660 

Modifications de 8.4 pour 8.4b 

390 LOAD " dessi nsB " f &30O0 

410 c=&3000+ (phase- 1 ) * ( 1 3*33 ) 

470 x=0:y=170:ecran=52880 

480 lar=13:hau=33 

510 POKE &459C,0:PQKE &459D,&80 

530 colli=&45B0:table=&S200 

540 POKE &45B1,&0:POKE &45B2,&82 

620 POKE Se45B9,0:POKE &45BA,&80 

Modifications de 8.4 pour 8.4c 

390 LOAD " dessi nsC" ,&3000 

410 c=&3000-Kphase-D* (21*19) 

470 x=0:y=170:ecran=52880 

480 lar=21shau=19 

510 POKE &459C,0:POKE &459D,&B0 

530 colli=Sc45B0:table=&8200 

540 POKE &45B1,&0:PQKE &45B2,&B2 

620 POKE &45B9,0:POKE &45BA,&80 

Vous constatez la quasi-disparition des instructions POKE. II ne reste en 
effet que les initialisations (memorisation preliminaire du decor, mise en 
place des valeurs initiales des variables) et le changement de phase 
d'animation (modification de la variable DESSIN). Notez egalement le test 
assocte a ('instruction CALL &BD19, permettant de synchroniser I'affichage 
de I'objet avec le balayage de l'6cran. Celui-ci depend de la position 
verticale de I'objet 

Ce programme nous permet de constater deux choses : d'abord, et 
c'6tait le but a atteindre, les d6placements s'effectuent d6sormais h une 
vitesse correcte. Mais, surtout, le programme est beaucoup plus simple. Le 
deplacement est int^gralement ger6 par un simple CALL : restitution et 
memorisation du decor, blocage des territoires interdits, preservation des 
avant-plans. Nous disposons maintenant d'une routine extr§mement 
puissante. 



CREATION DES OBJETS 

ET DECORS 



9 



La creation des objets graphiques et des images de decor necessite 
g^neralement un programme approprie, h moins de recourir au codage 
manuel de chaque octet de ia memoire ecran. Nous proposons done, dans 
ce chapitre, un ensemble de programmes utilitaires a cet effet. Nous n'en 
detaillerons pas le fonctionnement. lis vous permeltront de creer une 
bibliotheque de dessins et d'objets graphiques utilisables dans vos 
programmes d'application. 

Une dernidre remarque s'impose au sujet des programmes de ce 
chapitre. Afin de mettre en place un veritable systeme de gestion des 
objets et decors, les programmes utilisent une structure commune de 
noms de fichiers. Par exemple, un fichier d'extension IME est une image 
creee par I'utilitaire de dessin. La majorite des travaux s'effectuant a partir 
de ces fichiers, nous avons suppose la presence d'un lecteur de disquettes. 
Les travaux seraient d'ailleurs trds fastidieux sans un tel accessoire. 



230 I GRAPHJSMES EN ASSEMBLEUR SUR AMSTRAD 

PROGRAMME DE CREATION DE DESSINS 
Mise en ceuvre et utilisation 

Le programme Basic charge le fichier binaire SCROLLS.BIN contenant 
ses routines assembleur. II faut done creer ce fichier avant d'utiliser le 
programme. Pour cela, entrez le source assembleur ci-joint et assemblez- 
1e, puis sortez-le sous forme de fichier. Autre solution : rentrer les codes 
hexadecimaux en memoire un par un f puis sauver la zone memoire ainsi 
occupee par une commande SAVE du Basic, sous ie nom SCROLLS.BIN. 



10 OPENOUT"d":MEMORY &1BFF :L0AD"scro I I s" zCLOSEOU 

T: CLEAR: PRINT CHR*(23)CHR*< 0) 
20 MODE OiPEN 14iKEY 138 /'pen 1sink 1,15xinode 2" 

+CHR$<13) 
30 WINDOW »0,1,20,1,3:UINDDW C1 > 1 , 20 ,4 ,5 
40 DEFINT a-z:DIM col<1S>,h<16> 

50 draite=XB1FC:gauche=&813E:haut=*81 10:bas=X815 

7:param=X8397:pa1=£1CO0+16O*73:pa2=pa1+79:pa3= 

X1COO:ful l=X,83AA:clr=X8333:wide=t83E0:G0SUB 20 

000 

60 FOR i=0 TO 15:co I < i >=i : INK i f i :NEXT:co I ( 18) =- 

1 xCALL clr 
70 FOR i=0 TO 153 STEP 2:M0VE i*4,0:DRAW i*4>153 

*2,15:M0VE 0*i*2:DRAW 153*4, i*2, 15: NEXT 
80 SYMBOL 255,&FF>&81 , £81,&81 ,£81 ,£81 , &81 , &FF 
90 PEN81 ,14xPAPERltO,0:CLSJM 
100 FOR i=0 TO 15: IF i=enc THEN PRINTH1 ,CHR$<24 ) 

+CHR*(col <i)+65)+CHR*<24> ; ELSE PRINT81 , CHR$ < 

col <i)+65>; 
110 NEXT:PRINTB1 
120 FOR x=0 TO 15 

130 PAPER81 , i:PRINTH1 ,CHR$<255) ; 
140 NEXT:PAPERtt1 ,0zPENtt1 , 1 5: PRINTB1 , CHR*< 24 ) + "0" 

CHR*(24) ; 
150 IF mo=0 THEN 310 ELSE IF rao=2 THEN 520 
1B0 CLSif lag=0:PRINT"SELECTION COULEURS: " : IF enc 

=16 THEN GOSUB 10020:enc=15: GOSUB 10030 
170 PRINT CHR$<240>+" "+CHR$<241 ) +" xCOULEUR" :PRI 

NT CHR*(242>+" " +CHR*<243> + " : STYLO" : 
180 A*=INKEY*:IF (A$< >CHR*< 13) > AND <a$<>"~"> AN 

D (A$<CHR*(240) OR A* >CHR* < 243 ) > THEN 180 
130 IF a*<>""" THEN 220 

200 IF flag THEN c=pa3:CALL wide: f I ag=0:GOTO 180 
210 CALL ful I :f lag=1:GOT0 180 
220 IF A*=CHR$(13) THEN mo=2:G0T0 520 
230 ON ASCCa*)-233 GOSUB 240 ,260; 280; 290 : GOTO 30 


240 IF colCenc)<1 THEN RETURN:REM ELSE IF enc>0 

THEN IF col (enc>=col (enc-1) THEN RETURN 
250 col <eno>=col (enc)-1 : INK enc,col (enc) : GOTO 10 

030 



CREATION DES OBJETS ET DECORS I 231 



2B0 IF col<enc)>25 THEN RETURN:REM ELSE IF enc<1 

5 THEN IF col (enc)=col (enc+1 > THEN RETURN 
270 col (enc)=co! (enc>+1 : INK enc,co I (enc) :G0T0 10 

030 
280 IF enc=0 THEN RETURN ELSE GOSUE: 10020 : :enc=e 

nc-1 :G0T0 10030 
290 IF enc=15 THEN RETURN ELSE GOSUB 10020:enc=e 

nc+1iG0T0 10030 
300 GOTO 180 
310 ' 

320 CLS:PRINT"CURSEUR-TRACE" 

330 cou=PEEK(*1COO+yg*1£0+xg) ;PLOT 4* < xgb*2+1 ) ,2 
*(ygb*2+1 > , 1&tNOT(cou) :LQCATE cou* 1 f 3 x PRINT C 
HR$<241 ) ; 
3^0 a$=UPPER$(INKEY*> : PLOT 4*< xgb»t2 + 1) ,2* (ygb*2+ 

1 ) jCOUiLOCATE COU+1 ,3:PRINT" "; 
350 GOSUB 10010 
360 IF a$=CHR*(13) THEN mo=1:G0T0 150iREM select 

cou I eurs 
370 IF a*<"0" OR aS>"C M THEN 400 
380 c=ASC(a*)-65:F0R I =0 TO 1&:IF col(l)=c THEN 

GOSUB 10020:enc=l :GOSUB 10030:1=17 
390 NEXT: GOSUB 10020: GOSUB 10030: GOTO 330 
400 IF a*<CHR*(2A0> OR a4>CHR*(243> THEN 330 
410 IF encOIG THEN POKE XlCOO+ygwISO+xg^enc :PL0 

T 4*(xgb*2+1) ,2*(ygb*2+1 ) ,enc 
420 ON ASC(a*)-239 GOSUB 450 , 430 , 470 , 430 : GOTO 51 


430 IF ygb=0 THEN IF yg=0 THEN RETURN ELSE pa1=U 
NT(pa1-1G0) ipa2=UNT(pa2- 1GG) r pa3=UNT ( pa3- 1E0 ) 
=c=pa3:G0SUB 10000:CALL haut 
440 yg=yg+(yg>0) :ygb=ygb+ (ygb>0) : RETURN 
450 IF ygb=73 THEN IF yg=153 THEN RETURN ELSE P a 
1=UNT(pa1 + 160) :pa2=UNT(pa2+1&0):pa3=UNT<pa3+1 

£0> lc«p«1 iGOSUB 10000:CALL bas 
4E0 yg=yg-(yg<159) :ygb=ygb- Cygb< 73) :RETURN 
470 IF xgb=0 THEN IF xg=0 THEN RETURN ELSE pa1=U 

NT(pa1-1 ) :pa2=UNT(pa2-1 ) :pa3=UNT(pa3- 1 ) :c=pa1 

:GOSUB 10000:CALL droite 
480 xg=xg+(xg>0> : xgb=xgbf < xgb>0) rRETURN 
490 IF xgb=73 THEN IF xg=153 THEN RETURN ELSE pa 

1=UNT<pa1+1 )xpa2=UNT(pa2+1) :pa3=UNT(pa3+ 1 ) :c= 

pa2::G0SUB 10000:CALL gauche 
500 xg=xg-(xg<159) r xgb=xgb- < xgb<7S> :RETURN 
510 GOTO 330 
520 ' 
530 CLSiPRINT-'COM. " +CHR* (24) + "S" +CHR*< 24 ) +"-SAV 

E ECRAN":PRINT CHR*(24> + "L" +CHR$ (245 +" -LOAD , " 

+CHR*(24)+"-"+CHR*( 24)+" -IMAGE": PRINT CHR*(24 

>+"D"+CHR*(24>+"-FICHIER OB JET"; 
540 A$=UPPER*(INKEY$) 

550 IF A*=CHR*<13> THEN MO=0:GOTO 150 
560 IF A*="S" THEN &10xREM save 
570 IF A*="L" THEN &40:REM LOAD 
580 GOSUB 10010 
590 IF A*="D" THEN 7000:REM DUhP SUR PRINTER 

SOO GOTO 540 

S10 CLS:PRINT"NQM FICHIER" : INPUT A$ :CLS:PRINT"SA 
VE EN COURS" 



232 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 

620 SAVE a» + l '«iJHe"^,X1C0O, X.6400x0PEN0UT a$+".pa 
e"xPRINTtt9, xg,yg,pa1 ,pa2,pa3, xgb,ygbxFOR i=0 
TO 15xPRINT89,col (i) xNEXT rCLOSEOUT xa*="*.bak" 
: !ERA,@a$ 
B30 GOTO 530 

64.0 CLEAR iDEFINT a-zxDIM co I < 16) ,h< 16) xGOSUB 200 
00:CLSrPRINT"NOM FICHIER" r INPUT A* : CLS r PRINT" 
LOAD EN C0URS"xdroite=&81FCxgauche=X819E:haut 
=&8110xbas=&8157xparam=&8397xful I =&83AAxc I r=& 
8399iwide=*83E0 
&50 LOAD a$+" 4 ime",aiC00:0PENIN a* + " . pae" : INPUTtt 
9>xg,yg,pa1 ,pa2,pa3,xgb,ygbxF0R i=0 TO 15xINP 
UTtt9,col <i> i INK i,col <i) : NEXT: col C16)=-1 :CLOS 
EINxe=pa3xG0SUB 10000:CALL widexmo=OxGOTO 80 
7000 CALL ful I :x1=0xy1=0xCLSxPRINT"P0INT HAUT GA 

UCHE ?";xPRINT CHR$ ( 23) x CHR* CO) ; 
7010 a=TEST<x1,y1)iPL0T x1 ,y1 ,0x A$=INKEY* xPLOT X 
1,Y1,15xPL0T x1,y1,axIF A$<CHR*<240) OR A*>C 
HR*<243> THEN IF A*OCHR$<13) THEN 7010 
7020 IF A$=CHR$<13) THEN 7050 

7030 IF A«=CHR$<240> THEN Y1=Y1+2 ELSE IF a*=CHR 
$(24-1) THEN y1=y1-2 ELSE IF a«=CHRS<242) THE 
N x1=x1-4 ELSE IF a*=CHR*<243) THEN x1=x1+4 
7040 GOTO 7010 

7050 CLS:x2=X1 xy2=Y1 xPRINT CHR*< 23) ;CHR*< 1 ) ; 
7060 LOCATE 1 , 1 xPRINT"LAR" ; INT ( (X2-X1 + 1) /8) :PRIN 
T"HAU":INT<<Y2-Y1 )/2) rMOVE X1,Y1xDRAW X1,Y2, 
15:DRAW X2,Y2xDRAW X2,Y1xDRAW X1 , Y1 : A*=INKEY 
txMOVE X1,Y1xDRAW X1,Y2xDRAW X2,Y2xDRAW X2,Y 
1 :DRA« X1 ,Y1 
7070 IF A*=CHR$<13) THEN 7100 

7080 IF A$=CHR$<240) THEN Y2=Y2+2 ELSE IF a$=CHR 
*<241> THEN y2=y2-2 ELSE IF a*=CHR*<242) THE 
N x2=x2-4 ELSE IF a*=CHR*<243) THEN x2=x2+4 
7090 GOTO 7060 

7100 CLSxINPUT"SAVE ADD, " xadx a1 =ad x FOR Y=Y1 TO 
Y2 STEP -2xA*="" xFOR X=X1 TO X2 STEP 8 X POKE 
ad,h(TEST<x,y))*2+h(TEST<x+4,y))xad=ad+1 xNEX 
TxNEXTxPRINT CHR$<23) ;CHR$( 0) ; 
7110 INPUT "Nora "ifiiSAVE f * + " . xmo" ,b,a1 ,ad-a1 +1 
xc=pa3:0PEN0UT f $+ " .pao" xPRINTJIS , INT< (X2-X1 ) 
/8)+1,INT< (Y1-Y2)/2) :FOR i=0 TO 1 5xPRINT»9,c 
ol <i)xNEXTxCLOSEOUTxa*="*.bak"x ! ERA ,@a* :CALL 
widexGOTO 520 
10000 POKE pararo,UAL("&"+RIGHT$(HEX*<c,4) ,2)) xPO 

KE param+1,VAL<"r'+LEFT»<HEX*<c,4),2> ) zRETU 
RN 

10010 IF UPPER*(A*)="~" THEN CALL fullxWHILE INK 

EY*="" xWENDxc=pa3xG0SUB 10000xCALL widexRET 

URN ELSE RETURN 
10020 LOCATE** 1 ,enc+1,1 xPRINTttl ,CHR*<col <enc)+65) 

;x RETURN 
1O030 LOCATEttl ,enc+1,1 xPRINTttl ,CHR* < 24- ) +CHR*< co I 

(enc)t&5) +CHR$<24> ; : RETURN 
1004-0 RETURN 
20000 RESTORE 20000xFOR 1=0 TO 15xREAD h*xH(I)=V 

AL ( " I" * H* ) : NEXT x RETURN 
20010 DATA 00, 40, 04., 44, 10,50, 14,54,01 ,41, 05,45,1 

1 ,51 ,15,55 



CREATION DES OBJETS ET DECORS I 233 

IB ; 

20 jprograwne utiiitaire - 

30 jpartie asseaibLeur gestian des scrollings et affichages 

0R6 18100 
DEFB 
DEFB 64 
DEFB 4 
DEFB 68 
DEFB 16 
DEFB 80 
DEFB 20 
DEFB 84 
DEFB i 
DEFB 65 
DEFB 5 
DEFB 69 
DEFB 17 
DEFB 81 
DEFB 21 
DEFB 85 

220 ;SCROLLING VERS LE HAUT DE DEUX. LI6NES 
8110 DD215582 230 HAUT: LD IX,TABLE ;IX pointe sur 3e ligne ecran 

graph i que 



8100 


40; 
50 


8100 00 


60 


8101 40 


70 


8102 04 


80 


8103 44 


90 


8104 10 


100 


8105 50 


110 


8106 14 


120 


8107 54 


130 


8108 01 


140 


810? 41 


150 


810A 05 


160 


810B 45 


170 


810C 11 


180 


810D 51 


190 


810E 15 


200 


810F 55 


210 



8114 


DD5E00 


240 LOOP: 


LD E,(IX+0) 




8117 


DD5601 


250 




LD D,(IX+1) 


;DE=adresse ligne du haut 


811A 


DD6E04 


260 




LD L,(IX+4) 




81 ID 


DD6605 


270 




LD H,(IX+5) 


;HL=adresse 2 lignes +bas 


8120 


015000 


280 




LD BC,80 


;80 octets a translater 


8123 


EDB0 


290 




LDIR 


;transfert 


8125 


DD23 


300 




INC n 




8127 


DD23 


310 




INC IX 


; ligne suivante 


8129 


DD7E04 


320 




LD A,(IX+4) 




812C 


DDB605 


330 




OR (IX+5) 


;fin table ? 


812F 


C21481 


340 




JP NZ,LOOP 








350 


remp 


issage des deux dernieres 


lignes 






360 


pour 


quadrillage 




8132 


DD2A9783 


370 




LD IX f (PARAH) 


;adresse de la ligne dans 
l'iflage 


8136 


2180F7 


380 




LD HL,#F780 


javant derniere 


8139 


0650 


390 




LD B,B0 


;80 octets a reaplir 


813B 


0EAA 


400 




LD C,170 


; point de gauche allune 


813D 


1681 


410 
420 




LD 0,181 


;paids fort table masses 


813F 


DD7E00 


430 PP1: 


LD A, (IX) 


;couleur du point 


8142 


5F 


440 




LD E,A 




8143 


!A 


450 




LD A,(DE) 


;aasque du point 


8144 


Bl 


460 




OR C 


;ajoute point gauche 


8145 


DD23 


470 




INC IX 


;en avant dans la liqne if 



image 



234 I GRAPHEMES EN ASSEMBLEUR SUR AMSTRAD 






8147 77 

8148 23 

8149 10F4 

814B 2180FF 

814E 0650 

8150 3EFF 

8152 77 

8153 23 

8154 10FC 



480 



8156 C9 



8157 
815B 
815E 
8161 
8164 
8167 
816A 
816C 
816E 
8170 
8173 
8176 



DD218F83 
DD5E04 

DD5605 

DD6E00 

DD6601 

015080 

EDB0 

DD2B 

DD2B 

DD7E00 

DDB601 

C25B81 



8179 2190C1 
817C 0650 
817E 0EAA 

8180 1681 
8182 DD2A97B3 

8186 DD7E00 

8189 5F 
818A 1A 
818B Bl 
B18C 77 
818D 23 
B18E DD23 

8190 10F4 

8192 2190C9 

8195 0650 

8197 3EFF 

8199 77 

819A 23 

819B 10FC 

819D C9 



500 

510 ; 

520 

530 

540 

550 PP2: 

560 

570 

580 ; 

590 



LD (HL),A 
INC HL 
DJNZ PP1 



LD 
LD 
LD 
LD 
INC 



HL,#FF80 
8,80 
A, 255 
(HL) ,A 
HL 



jderniere 



DJNZ PP2 



RET 



600 ; SCROLLING VERS LE BAS DE DEUX LIGNES 



610 BAS: 

628 LAAP: 

630 

640 

650 

660 

670 

688 

690 

700 

718 

720 



IXJABFIN 

E f (IX+« 

D,(IX+5) 

L,(IX+0) 

HjUX+1) 

BC,80 



LD 

LD 

LD 

LD 

LD 

LD 

LDIR 

DEC IX 

DEC IX 

LD A,UX+0) 

OR (IX+1) 

JP NZ,LAAP 



738 ;ref&plissage quadrillage en haut 



740 
758 
760 
770 
780 
790 ; 

800 PLAP1: 
810 



830 

840 

850 

860 

878 

880 ; 

890 

900 

910 

920 PLAP2: 

930 

940 

950 ; 

960 



LD 
LD 
LD 
LD 
LD 

LD 

LD 

LD 

OR 

LD 

INC 

INC 



HL,#C190 

B,80 

C f 17l 

D,«81 

IX,(PARAt1) 

A,(IX+0) 

E,A 

A,CDE) 

C 

(HL),A 

HL 

IX 



DJNZ PLAP1 

LD HL,#C990 
LD B,80 
LD A,255 
LD (HL),A 
INC HL 
DJNZ PLAP2 

RET 



;2 lignes ecran +bas 

;cette ligne 

;80 octets a transferer 
;copie de la ligne 
; descend dans la table 

; octet 

;f in de la table ? 

;non:continuer 

; ligne a dessiner 
;80 octets a retaplir 
; point de gauche allmne 
;poids fort table masques 
jadresse ligne dans image 

jcouleur point 

; Basque point 

;les deux points positionnes 



CREATION DES OBJETS ET DECORS I 235 



970 ;SCR0LLIN6 VERS LA GAUCHE DE 2 POINTS 



819E 


DD215582 


980 GAUCHE: 


LD 


IX,TABLE 


81A2 


DD5E00 


990LUUP: 


LD 


E,(IX+0> 


81A5 


DD5601 


1000 


LD 


D,<IX+1) 


81A8 


6B 


1010 


LD 


L,E 


81A9 


62 


1020 


LD 


H,D 


81AA 


23 


1030 


INC 


HL 


81AB 


014F00 


1040 


LD 


BC,79 


81AE 


EDB0 


1050 


LDIR 




81B0 


DD23 


1060 


IIC 


H 


81B2 


DD23 


1070 


INC 


IX 


81B4 


DD7E00 


1080 


LD 


A,(IX+0) 


81B7 


DDB601 


1090 


OR 


(IX+1) 


atBA 


C2A281 


1100 


JP 


NZ,LUUP 






1110 ;rempl 


ssage 


quadrillage a di 


81BD 


FD2A7785 


1120 


LD 


IY,(PARAM) 


81C1 


DD215582 


1130 


LD 


IX, TABLE 


BIC5 


1681 


1140 
1150 ; 


LD 


D,**S1 


81C7 


DD6E00 


1160 PLUP1: 


LD 


L,(IX+0) 


81CA 


DD6601 


1170 


LD 


H v (IX+1) 


81CD 


014F00 


1180 


LD 


BC,79 


81D0 


39 


1190 


ADD 


HL,BC 


81D1 


FD7E00 


1200 


LD 


A t (IY) 


81D4 


S£ 


1210 


LD 


E,A 


81D5 


1A 


1220 


LD 


A,(DE) 


81D6 


F6AA 


1230 


OR 


170 


81D8 


77 


1240 


LD 


<HU f A 


81D9 


0160FF 


1250 


LD 


BC,-160 


81DC 


FD09 


1260 


ADD 


IY,BC 


81DE 


DD23 


1270 


INC 


IX 


81E0 


DD23 


1280 


INC 


IX 


81E2 


DD6E00 


1290 


LD 


L,(IX+8) 


81E5 


DD6601 


1300 


LD 


H,(IX+1) 


B1E8 


014F00 


1310 


LD 


BC,79 


81EB 


09 


1320 


ADD 


HL,BC 


81EC 


36FF 


1330 


LD 


(HL) ,255 


81EE 


DD23 


1340 


INC 


IX 


81F0 


DD23 


1350 


INC 


IX 


81F2 


DD7E00 


1360 


LD 


A,(IX+fl) 


81F5 


DDB601 


1370 


OR 


(IX+1) 


81F8 


C2C781 


1388 
1390 ; 


JP 


NZ,PLUP1 


81FB 


C9 


1400 


RET 








1410 ; SCROLLING VERS LA DROITE DE 


B1FC 


DD215582 


1420 DROITE: LD 


IX,TAELE 


8200 


DD6E00 


1430 LEEP: 


LD 


L f (IX+0) 


8203 


DD6601 


1440 


LD 


H, (IX+1) 


8206 


014F00 


1450 


LD 


BC,79 


8209 


09 


1460 


ADD 


HL,BC 



Ipoids fort adresse masques 



;couleur point 

jmasque point 
jajoute point gauche 



j point du dessus dans image 



2 POINTS 



236 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 



B20A E5 

320B Dl 

82BC 2B 

820D EDBB 

820F DD23 

8211 DD23 

8213 DD7E00 

8216 DDB601 

8219 C20082 

821C FD2A9783 

8220 DD215582 
8224 1681 
8226 DD6E00 
822? DD6601 
B22C FD7E00 
822F 5F 

8230 1A 

8231 F6AA 

8233 77 

8234 0160FF 
8237 FD09 

8239 DD23 
823B DD23 
B23D DD6E00 

8240 DD6601 
8243 36FF 
8245 DD23 
8247 DD23 
8249 DD7E00 
824C DDB601 
824F C22682 



8252 
8253 
8255 
8265 
8275 
8285 
8295 
82A5 
82B5 
82C5 
82D5 
B2E5 
82F5 
8305 
8315 
8325 



C9 



90C190C9 
E0C1E0C9 
30C230CA 
80C280CA 
B0C2D0CA 
20C320CB 
70C370CB 
C0C3C0CB 
10C410CC 
60C460CC 
B0C4B0CC 
00C500CD 
50C550CD 
A3C5A0CQ 



1470 

1480 

1490 

1500 

1510 

1520 

1530 

1540 

1550 

1560 ;rempl 

1570 

1580 

1590 

1600 PLEP1: 

1610 

1620 

1630 

1640 
1650 

1660 
1670 

1680 

1690 

1700 

1710 

1720 

1730 

1740 

1750 

1760 

1770 

1780 

1790 ; 

1800 

1810 

1820 TABLE: 

1830 

1840 

1850 

1860 

1870 



PUSH HL 
POP DE 
DEC HL 
LDOR 



IX 

IX 

A, (IX+0J 

(IX+1) 
NZ,LEEP 
issage quadrillage a gauche 
LD IY,(PARAM) 
[X.TABLE 
D,tt8i 
L,(IX+0) 
H,(IX+1) 
A, (IV) 
E,A 
ft, (BE) 
170 
(HL),A 
BC,-160 
IY,BC 
IX 
IX 

L,(IX+0) 
H, tIX+1) 
(HL) ,255 
IX 
IX 
A,(IX+0i 

(ix+n 

NZ,PLEF1 



1890 
1900 
1910 
1920 
1930 
1940 
1950 



INC 
INC 
LD 

OR 
JP 



LD 

LD 

LD 

LD 

LD 

LD 

LD 

OR 

LD 

LD 

ADD 

INC 

INC 

LD 

LD 

LD 

INC 

INC 

LD 

OR 

JP 



;couleur point 

j masque point 
;ajoute point gauche 
;ok 



RET 

DEFW #0000 

DEFH #C19B 1 «C99B f #Di9a 1 iD99a 1 «Ei9B l «E99i f iF19B 1 «F99a 

DEFW #ClE0,#C9E0,ttDlE0 1 ttD9E0,ftElE0 1 ftE9E0,ftFlE0,ttF9E0 
DEFW#C230 1 *tCA30,#D230,#DA38 1 #E230,ftEA30,#F230,#FA30 
DEFW #C2Ba i teABB,i»2Ba f tDAaB 1 IIE2BB f fEABB l #F2BB l iFABB 
DEFW*C2D0,*CAD0 ) #D2D0 J ttDAD0,SE2D0 1 «EADa,#F2D8,#FAD0 
DEFW #C320 , tCB20 , SD320 , #DB20 , #E320 , #EB20 , *tF32S , #FB20 
DEFW #C370 , CB70 , #D370 , ttDB70 , #E370 , #EB70 , #F370 , SFB70 
DEFU#C3C0,OC0,ftD3C0,ftDBC0 l ftE3C0 l #EBC0,#F3C0,#F8C0 
DEFW ttC410,*tCC10 1 ftD410,ttDC10,#E410 1 #EC10,#F410,SFC10 
DEFW ttC460,#CC60,#D460,#DC60 1 ttE460,#EC60,#F468,#FC60 
DEFW #C4B0 , #CCB0 , #D4B0 , #DCB0 f #E4B0 , #ECB3 , #F4B8 , #FCB0 
DEFW #0500,000, #D500 , ttDDEffl , #E500 , #EDCffl , SF500 , #FD00 
DEFW &C550 , #CD50 , #D550 , #DD50 , #E550 , #ED50 , #F550 , #FD50 
DEFW #C5A0,#CDA0,#D5A0,#DDA0 s flE5A0,#EDA0,tF5A0,fFDA0 



CREATION DES OBJETS ET DECORS ! 237 



8335 


F0C5F0CB 


1960 


DEFW 


#C5F0,OF0,ttD5F0,ffl) 


DF0,iE5F0,tOF0,#F5F0,#FDF0 


8345 


40C640CE 


1970 


DEFW SC640 , #CE40 , 8D640 , #DE40 , #E640 , SEE40 , #F640 , #FE40 


8355 


90C690CE 


1980 


DEFW #C690,ttCE90,ftD690,ttDE90,ftE690 T #EE90,SF690,#FE93 


8365 


E0C6E0CE 


1990 


DEFW ttC6E0 , #CEE0 , #D6E0 , #DEE0 , #E6E0 , &EEE0 , SF6E0 , #FEE3 


8375 


30C730CF 


2000 


DEFW #C73.0,CF30,ftD730,8DF30,ttE730,#EF30, «F73B 1 «FF30 


8385 


B0C78ECF 


2010 


DEFW ttC780,CF80,BD780,t!D 


F80,#E780 


838F 


80EF80F7 


2020 TABFIN: 


DEFW #EF80,#F780,ltFF80 




8395 


0000 


2030 


DEFW #0000 




8397 


0000 


2040 F'ARAll: 


DEFW 








2050 ; 












2060 ;EFFACEMENT IMAGE 








2070 ; 








8399 


21001C 


2080 CLS: 


LD 


HL,#1C00 




839C 


1600 


2090 


LD 


D,0 




839E 


010064 


2100 


LD 


BC,160*i60 




83A1 


72 


2110 PQPOF: 


LD 


(HL) ,D 




83A2 


23 


2120 


INC 


HL 




S3A3 


0B 


2130 


DEC 


BC 




83A4 


78 


2140 


LD 


A 5 B 




83A5 


Bl 


2150 


OR 


C 




83A6 


C2A183 


2160 


JP 


NZ,PDP0P 




83A9 


C9 


2170 
2180 ; 


RET 










2190 ;copie 


ecran 


de 1' image 








2230 ; 








33AA 


DD219383 


2210 FULL: 


LD 


IX,TABFIN+4 


;derniere adresse=bas ecran ptr 


I 83AE 


FD21001C 


2220 


LD 


IY,#1C00 


; debut image 


83B2 


2681 


2230 
2240 ; 
2250 PF: 


LD 


H,«81 


;poids fort table masques 


83B4 


DD5E0E 


LD 


E,(IX+0) 




83B7 


DD5601 


2260 


LD 


D,(IX+1) 


jadresse ecran 


83BA 


0650 


2270 
2280 ; 


LD 


B,B0 


;80 octets a inscrire 


83BC 


FD7E00 


2290 PF2: 


LD 


A,(IY+0) 


jcouieur point gauche 


83BF 


6F 


2300 


LD 


L,A 




83C0 


7E 


2310 


LD 


A, (HL) 


; masque du point 


83C1 


CB27 


2320 


SLA 


A 


jdecalage a gauche 


83C3 


4F 


2330 
2340 ; 


LD 


C,A 




83C4 


FD23 


2350 


INC 


IY 


;point suivant=a droits 


83C6 


FD7E00 


2360 


LD 


A,UY+B> 


jcouleur point droite 


83C9 


6F 


2370 


LD 


L,A 




83CA 


7E 


2380 


LD 


A,(HL) 


; masque point 


83CB 


Bl 


2390 


OR 


C 


jajoute point deja inscrit 


83CC 


12 


2400 
2410 ; 


LD 


(DE),A 


;ajoute point droite a 1 ecran 


83CD 


FD23 


2420 


INC 


IY 


; point suivant 


83CF 


13 


2430 


INC 


DE 


; octet ecran suivant 


83D0 


10EA 


2440 


DJNZ PF2 


;{inir cette ligne 



238 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 







2450 ; 






83D2 


DD2B 


2460 


DEC 


IX 


83D4 


DD2B 


2470 


DEC 


IX 


83D6 


DD7E00 


2480 


LD 


A,(IX+0) 


B3D9 


DDB681 


2490 


OR 


(IX+1) 


83DC 


C2B483 


2500 


JP 


NZ,PF 


83DF 


C9 


2510 

2520 ; 


RET 








2530 ;copie image 


dans grille 






2540 i 






B3E0 


DD219383 


2550 WIDE: 


LD 


IX,TABFIN+4 


83E4 


FD2A9783 


2560 


LD 


IY,(PARAM> 


83E8 


2681 


2570 

2580 ; 


LD 


H,ftSi 


83EA 


DD5E00 


2590 PV; 


LD 


E,(IX+0J 


83ED 


DD56S21 


2600 


LD 


D, (IX+1) 


83F0 


0658 


2610 


LD 


B,80 


83F2 


3EFF 


2620 
2630 ; 


LD 


A,255 


83F4 


12 


2640 PV2: 


LD 


(DE),A 


83F5 


13 


2650 


INC 


DE 


83F6 


10FC 


2660 


DJNZ PV2 






2670 ; 






83F8 


DD2B 


2680 


DEC 


IX 


83FA 


DD2B 


2690 


DEC 


IX 


83FC 


DD5E20 


2700 


LD 


E,(ix+m 


83FF 


DD56B1 


2710 


LD 


D,(IX+1) 


8402 


0650 


2720 
2730 ; 


LD 


B,B0 


8404 


FD7E00 


2740 PV3: 


LD 


A,UY+0) 


8407 


6F 


2750 


LD 


L,A 


84133 


7E 


2760 


LD 


A,(HL) 


8409 


F6AA 


2770 


OR 


170 


840B 


12 


2780 


LD 


IDE), A 


840C 


13 


2790 


INC 


DE 


840D 


FD23 


2800 


INC 


IY 


840F 


10F3 


2B10 


DJNZ PV3 






2820 ; 






B411 


DD2B 


2830 


DEC 


IX 


8413 


DD2B 


2840 


DEC 


IX 


8415 


115000 


2850 


LD 


DE,80 


8418 


FD19 


2860 


ADD 


IY,DE 


841A 


DD7EB0 


2870 


LD 


A,(IX+B) 


841D 


DDB6Q1 


2880 


OR 


(IX+1) 


8422 


C2EA83 


2890 


JP 


NZ.PV 


8423 


C? 


2900 


RET 





jcontinue dans la table en 
remontant 

;fin table ? 



; table ecran 

jadresse debut fenetre image 

;poids farts masques 



jadresse ecran reelle 
:40 octets a ecrire 



jcouleur point 

; roasque point 
;pour grille 
jstockage ecran 
javance ecran 
; avarice image 
jcontinue copie ligne 



;sauter a la ligne du dessus ! 



Pass 2 errors: 00 



CREATION DES OBJETS ET DECORS i 239 

Mode d'ernploi 

Le programme comporte trois modes, la touche ENTER on RETURN 
permettant le passage du 1 au 2, du 2 au 3, ou du 3 au 1. 

Le mode 1 est "CURSEUR TRACE". Dans ce mode, le curseur clignote 
dans la grille. Vous pouvez alors le d^placer avec les touches filches du 
clavier. La couleur de trace est indiquee au-dessus du dessin par une iettre 
en video inverse. II y a 16 lettres, representant les 16 stylos (la Iettre en elle- 
meme indique la couleur du stylo : A pour 0, B pour 1, jusqu'a "]" pour 26). 
Le symbole suivant, " ", represente un stylo fictif transparent- 
Pour seiectionner un stylo de trace dans le mode 1, il suffit de taper la 
Iettre qu'il represente. Le dernier stylo ("@") permet de depiacer le curseur 
sans effacer le dessin. 

La fleche qui se trouve au-dessus d'une des lettres indique en quel stylo 
le point sous ie curseur est trace. Enfin, la touche " f " (3 cote de CLR, et 
non sur ie pave des fleches curseur) permet de visualiser l'6cran en taille 
normale. Un deuxieme appui de cette touche ramene I'ecran en zoom 4/1. 

Le mode 2 permet de modifier les couleurs associees aux stylos, les 
fleches curseur horizontales choisissent le stylo, et les fleches verticales la 
couleur. La touche " f " (a gauche de CLR) affiche I'ecran en entier et taille 
normale, permettant ainsi de choisir les couleurs plus facilement. II faut 
appuyer une deuxieme fois sur la touche avant de passer en mode 1 ou 3. 

Le mode 3 autorise quatre operations. Les deux premieres, "SAUVE 
ECRAN" et "LOAD", effectuent une sauvegarde ou un chargement de tout 
I'ecran (avec tout ce qui est dessine, y compris les zones non affichees a 
cause du mode Zoom) et des couleurs de stylos. On peut ainsi sauver d'un 
bloc tout le travail en cours et le reprendre ensuite. Attention : les fichiers 
IME et PAE crees par cette option ne sent pas directement recuperables. Le 
fichier IME contenant I'image utilise en effet un format de stockage 
particulier (26 Ko de memoire) afin d'optimiser les travaux de dessin. Pour 
transformer ce fichier en image ecran utilisable, il suffit d'utiliser I'utilitaire 
destine a cet effet (voir partie II). 

La fonction " f " (touche a cote de CLR) permet d'avoir une vision globale 
de I'image, comme dans les autres modes. Et enfin, "D" permet de 
sauvegarder un objet dans un fichier binaire. Pour cela, il faut indiquer le 
point superieur gaache de I'objet, puis inferieur droit. Le programme 
affiche la largeur et la hauteur en nombre de points, il faut les noter. 
Ensuite, le programme demande a quelle adresse il doit placer le codage 
binaire de I'objet. Cette adresse doit §tre choisie de fagon a ne pas ^eraser 
les routines LM du programme. On peut le placer n'importe ou entre $1 COO 
et $7000, par exemple. II convient dans ce cas de sauver prealablement 
I'ecran (avec I'option "S") car I'objet cree a partir de I'ecran peut ecraser 
celui-ci sur une petite partie (pour faciliter les traitements, le programme 
utilise en effet une image logique de I'ecran complet a partir de I'adresse 
1C0O). 



240 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 

Le programme affiche, tant que I'objet n'est pas defini, les valeurs de 
LAR et HAU afin de vous aider a leur attribuer une valeur precise. Cela 
permet par exemple de creer sans erreur differentes phases d'animation 
d'un objet. 



Les fichiers IME et PAE 



L'option commande "S" du programme envoie dans un fichier d'exten- 
sion IME ("IMage Ecran") le contenu de ('image. Ce fichier peut etre 
recharge ou par le programme de dessin (afin de continuer le travail 
interrompu) ou par I'utilitaire de creation d'image, afin de le transformer en 
veritable image ecran, laquelle pourra etre chargee en memoire ecran par 
une commande LOAD en Basic. Les variables de travail associees a cette 
image dans le programme de dessin (c'est-a-dire I'endroit du curseur de 
trace, de la fenetre d'affichage, etc.) sont sauvegardees dans un fichier de 
meme nom que IME mais d'extension PAE "PArametres Ecran"). Les 
couleurs associees aux 16 stylos dans ce dessin sont egalement sauvees 
dans ce fichier. 

II ne faut pas effacer le fichier PAE : en effet," les utilitaires suivants 
I'utilisent pour recuperer les couleurs de stylos. 



Les fichiers IMO et PAO 



L'option "D" du programme cr6e les fichiers IMO et PAO de facon 
similaire a "S". Les fichiers d'extension IMO ("IMage Objet") represented 
le contenu exact d'un objet graphique ; il est done possible de les recuperer 
sans formalites par une commande LOAD en Basic. Le fichier PAO 
("PArametres Objet") de meme nom contient les donnees caracteristiques 
de cet objet : largeur (variable LAR), hauteur (variable HAU), et couleurs 
des 16 stylos. Si le programme d'application s'assigne de lui-meme ces 
valeurs, le fichier PAO peut §tre efface. Neanmoins, I'utilitaire de compac- 
tage d'objets livre dans les pages suivantes ('utilise pour verifier I'homoge- 
neite des donnees. Les donnees sont stockees dans le fichier de la facon 
suivante : 



LAR , HAU 
couleur stylo 
couleur stylo 1 
... etc .. 
couleur stylo 2 
fin du fichier. 



CREATION DES OBJETS ET DECORS I 241 

On peut les recuperer par la sequence suivante : 

OPENIN "nom.PAO" 
INPUT #9,lar,hau 
FOR i=0 TO 15 

INPUT#9,c 

INK i,c 
NEXT i 
CLOSEIN 

Lorsque vous utilisez le programme pour creer differentes phases 
d'animation d'un meme objet, vous devez prendre garde aux points 
suivants : 

- toutes les phases sauvees sous forme d'objet par la commande "D" 
doivent avoir des valeurs LAR et HAU identiques ; 

- les couleurs des 16 stylos doivent etre identiques pour chaque phase 
ainsi sauvegardee. II convient done de les choisir avant tout dessin. 



CREATION DE DECOR 



Le fichier decor 

Cet utilitaire permet la creation d'une image ecran veritable a partir d'un 
fichier IME cree par le programme precedent. 

Le programme affiche avant tout la liste des fichiers IME disponibles. 
L'utiiisateur indique alors son choix. Le programme cree, & partir du fichier 
choisi, un fichier de meme nom et d'extension SCR ("SCReen", e'est-a-dire 
Ecran en anglais) qui correspond directement au contenu de la memoire 
ecran. Ensuite, l'utiiisateur a la possibility d'effacer le fichier IME original. 
Ceci est recommande lors de la creation de decors, afin de recuperer de la 
place sur la disquette (ie fichier IME occupe 26 Ko). Neanmoins, dans 
certains cas, vous pouvez ressentir le besoin de garder ce fichier. Vous 
pouvez par exemple recuperer une image et la retravailler ulterieurement, 
ce qui ne sera pas possible si vous effacez le fichier IME. 



10 MODE 2: INK 0,0: INK 1,15: BORDER 0: PRINT"**** C 

REATION DE FICHIER ECRAN *-***- 
20 PRIWTsPRINT-LISTE DES FICHIERS DISPONIBLES:": 

A*="*. IME": ;DIR,«A* 
30 LOCATE t f VPOS<#0>-2: INPUT"Votre choix ";rvf*:I 

F INSTR<nf ♦,-.■) T>«N rvf$=LEFT* (rvfS, INSTRUvf * 9 

40 rtNORY &lBFF:LOAD-?icrolls-:LDAD n**+".i«e" ,&1 
C00 



242 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 

50 OPEN IN nf$+".pae-:INPUT#9 1 a,a l a 1 a 1 a f a,a:FOR i 

=0 TO 15:INPUT*9,c::INK i ,c: NEXT: GLOBE IN 
60 MODE 0:CALL &83AA:SAVE nf *+". scr" ,b,&C000, 163 

B4:a*="*.bak": :ERA,»a* 
70 Il« 1,15 
80 MODE 2: PRINT "Vous pouvez maintenant ef facer 

* 

r*=IF UPPER*(a*)=-OUI- THEN a*=nf *+-. i«e-= SERA 
,@a$ 
90 MODE 0:INK 8,0= INK 1,10: CALL &B3AA: WINDOW #0, 

1,20,1,5 
100 PRINT "SAISIE TERRITOIRES" 

110 ad=&lC00:PRINT"-X- fin de saisie" :x 1=0: yi=0 
120 x=x 1 : y=y 1 : h*=CHR* (240) : b*=CHR* (241 ) :g*=CHR* < 
242) :d*=CHR*( 243): LOCATE 1 ,3:PRINT-HALTT GAUCH 
E ("+g*+h*+d:*+b*+">-; 
130 z*=INKEY*:IF z*='x" OR z*= M X" THEN 320: 'fin 
140 IF z*=CHR*(13) THEN 210: droite 
150 IF z*=h* THEN y=y-l: IF y<0 THEN y=0:GOTO 190 

ELSE 190 
160 IF z*=b* THEN y=y+l:IF y>199 THEN y=199:BOTO 

190 ELSE 190 
170 IF z*=g* THEN x=x-l:IF x<0 THEN x=0:GOTO 190 

ELSE 190 
180 IF z*=d* "HEN x=x + l:IF x>159 THEN x=159:GOTO 

190 ELSE 190 
190 PRINT CHR*(23)CHR*(1); s PLOT x*4 ,399-y*2, 15= P 

LOT x*4,399-y*2,15 
200 BOTO 130 
210 POKE ad, INT (x/2): POKE ad+1 ,y: LOCATE 1,3:PRIN 

T"BAS DROITE ( n +g*+h*+d*+b$+" ) "; :xl=x:yl=y 
220 z*=INKEYS: IF z*=-x- OR z*="X" THEN 320: fin 
230 IF z$=CHR*(13) THEN 300: 'fin 
240 IF z*=h* THEN y=y-l:IF y<0 THEN y=0:BOTO 280 

ELSE 280 
250 IF z*=b* THEN y=y+l=IF y>199 THEN y=199:GOTO 

280 ELSE 280 
260 IF z*=g* THEN x=x-l:IF x<0 THEN x=0:GOTO 280 

ELSE 280 
270 IF z*=d* THEN x=x+ls IF x >159 THEN x^159=BOTO 

280 ELSE 280 
280 PRINT CHR*(23)CHRS<l);:FOR i=l TO 2=PLOT xl* 
4,399-2*yl:DRAW xl*4,399-y*2:DRAW x*4,399-y*2 
:DRAW x*4,399-y 1*2: DRAW x 1*4, 399-2*yl: NEXT 
290 GOTO 220 

300 POKE ad+2, INT <(x-x 1+1 )/2): POKE ad+3,y-yl+l: a 
d=ad+4: PRINT CHR* (23)CHR* (0) ; : FOR x2=4*xl TO 
4*x 
310 PLOT x2,399-2*y 1,15: DRAW x2,399-2*y:l*EXT:x 1 = 

xsyl=ysSOTO 120 
320 POKE ad,255:SAVE nf *+" . ter " ,b,&lC00,ad-&lC00 
+l:a*="*.bak": I ERA, £a*: RUN 



CREATION DES OBJETS ET DECORS I 243 

Les territoires interdits 



Une fois le fichier SCR cree, le programme affiche I'image et vous 
propose de rentrer les territoires interdits un a un. Pour cela, il suffit de 
deplacer le curseur sur le point situe en haut a gauche d'un territoire, de 
frapper ENTER ou RETURN, puis de meme pour le point inferieur droit de la 
zone. Le territoire correspondant est rempli par le programme afin de le 
distinguer du reste du decor. Vous pouvez ainsi memoriser plusieurs 
territoires interdits. Une fois le travail acheve, une pression sur la touche 
"X" du clavier permet ia creation du fichier d'extension TER contenant les 
donnees des territoires ainsi stockees. Ce fichier est directement utilisable 
sous Basic : il contient I'image exacte de la table des territoires interdits, 
selon la structure definie au chapitre8. Un programme d'application 
utilisant la routine 8.4 pourra done recuperer la table par une instruction 
LOAD "nom.TER",adresse suivie de deux POKEs destines a indiquer a la 
routine I'adresse de la table (voir le programme d'application 8.4). 



COMPACTAGE DE PHASES D'ANIMATION 
D'UN OBJET 



Mode d'emploi 

Ce programme permet de compacter en memoire les differentes phases 
d'animation d'un meme objet. II suppose avant tout que ces phases aient 
ete creees par le programme de dessin (option commande "D"). Les 
fichiers PAO doivent egalement etre presents. 

Avant toute chose, le programme vous propose d'effacer les fichiers PAO 
et IMO de chaque phase au fur et a mesure de leur compactage en 
memoire. Pour I'accepter, il faut entrer OUI en toutes lettres. Cette option 
n'est utile que dans le cas ou vous etes bien certain d'avoir fini de travailler 
sur ces phases. De meme que pour le programme de creation de decor, elle 
permet surtout de recuperer de la place sur une disquette. Mais si vous 
avez garde le fichier IME contenant les phases, il vous sera facile de recreer 
les fichiers IMO et PAO correspondants a partir de celui-ci, par I'interm6- 
diaire du programme de dessin. 

Ensuite, le programme affiche la liste des fichiers image objets dont il 
dispose sur la disquette. L'utilisateur peut entrer, un par un, les noms des 
fichiers contenant les phases. Cela fait, il choisit un nom pour le fichier final 
(celui qui contiendra les phases compactees en memoire). 



244 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 

10 DIM co<15) 

20 MODE 2: INK 0,0: INK 1,10: BORDER 

30 PRINT"**** CREATEUR DE FICHIERS DESSIN ****" 

40 MEMORY &2FFF 

50 PRINT:PRINT: INPUT "Dois-je e-ffacer les fichie 

rs originaux de chaque phase (OUI/NON) " ; a$: f lg 

= (UPPER* <a$) ="OUI " ) 

60 a$="*.imo" : !DIR,@a* 

70 PRINT "Entrez les noms des fichiers contenant 
■i 

80 PRINT"les phases de l'objet un par un, puis 

90 PRINT"tapez ENTER seul pour finir ":PRINT 

100 f i*=". ":no=0:ad=&3000 

110 WHILE fi$<>"" 

120 no=no+l 

130 PRINT "Fichier No" ;no; s INPUT "Nom ";fi*=IF I 

NSTRCf i$,". ") THEN -f i*=LEFT$ (-f i£, INSTR <-f i$, " . 

")-D 
140 IF -fi$= M " THEN 200 
150 OPENIN fi*+".pao": INPUT #9,1 ar ,hau: IF no>l T 

HEN IF larOlarl OR hauOhaul THEN PRINT"C0NF 

LIT DE TAILLE !":G0T0 130 ELSE ELSE haul=hau: 

larl=lar 
160 FOR i=0 TO 15:INPUT#9,c:IF no>l THEN IF cOc 

Q(i) THEN PRINT"CONFLIT DE COULEUR" : : GOTO 130 
ELSE ELSE co(i)=c 
170 NEXT 

180 LOAD f i$+ ,, .imo" , ad = ad=ad+l ar *hau 
190 IF fig THEN a$=f i*+" . imo" : !ERA ,@a*:a*=-f i*+" . 

pao": !ERA,@a$ 
200 WEND 
210 INPUT "Sous quel nom dois-je sauver 1 'ensemb 

le des images ";fi$:IF INSTR (fi$, % ") THEN fi 

$=LEFT$ (f i $ , I NSTR ( f i *,".")- 1 ) 
220 SAVE -f i*+".obj" ,b ,&3000,ad-&3000-*-l : OPENOUT -f 

i*+".par":PRINT#9,larl,haul,no-l:F0R i=0 TO 1 

5:PRINT#9,co(i):NEXT:PRINT#9,ad+l:CL0SE0UT 
230 RUN 



Les fichiers OBJ et PAR 



Le programme cree deux fichiers : le premier, d'extension OBJ ("0B- 
Jet") est la r6plique exacte de la memoire, de la premiere phase a la 
derniere. II est possible de charger ce fichier par une commande LOAD 
"nom.OBJ",adresse. Le second fichier, d'extension PAR, contient les 



CREATION DES OBJETS ET DECORS I 245 

parametres associes a ce fichier Obj. On les recupere par la sequence Basic 
suivante : 

OPENIN "nom.PAR" 
INPUT#9,lar,hau,nombrede phases 
FOR i=0 TO 15 

INPUT#9,c 

INK i,c 
NEXT i 
CLOSEIN 

Les adresses de debut de chaque phase de I'objet peuvent alors etre 
calcuiees facitement : si le fichier "nom.OBJ" a ete charge a I'adresse ADD, 
les adresses de chaque phase sont les suivantes : 

ADD 

ADD + lar * hau 

ADD + lar * hau * 2 

ADD + lar * hau * 3 

et ainsi de suite. 



Annexe 1 
Les mathematiques de I'informatique 



L'homme a dix doigts et, depuis ce temps-la, il compte habituellement en 
utilisant la base 10. 

Lorsque l'homme de Cromagnon, du haut de son rocher, voulait dire a 
son collegue se trouvant non loin de la, qu'il pouvait d6nombrer 
58 aurochs dans la plaine, il devait d'abord lever 8 doigts (unite), puis un 
instant plus tard, 5 doigts (dizaines, nombre de mains pleines) pour 
terminer par un geste demonstratif signifiant quelque chose comme 
"miam... miam I" 

II faut dire qu'ils avaient la vue pergante en ce temps-la, mais tout de 
meme, il y avait des limites, et lorsque la distance etait trop importante, il 
fallait utiliser une autre methode : les deux bras, par exemple. 

Mais si, avec les deux mains, on pouvait compter jusqu'a 10 (base 10), 
avec les deux bras, on ne peut compter que jusqu'a 2 (base 2). De plus, il ne 
faut pas oublier que le nombre correspondant a la base n'est jamais 
utilise : 10 aurochs auraient ete codes avec les mains : 

temps 1 : doigt Iev6 (unite) 
temps 2 : 1 doigt leve (dizaine) 
temps 3 : miam... miam I 



248 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 

De meme, 58 aurochs seront codes comme suit: 

temps 1 : 8 unites — > 8 

temps 2 : 5 fois la base = 5 * 10 — > 50 
temps 3 : miam... miam ! 

Et s'il y en a 1 253 : 

temps 1 : 3 unites = 3 

temps 2 : 5 fois la base =5*10 = 50 

temps 3 : 2 fois la base fois la base = 2*10*10 = 200 

temps 4: 1 fois... = 1*10*10*10 = 1000 

temps 5 : miam. ..miam I 



1253 



Avec les bras (base 2), 58 aurochs devront etre codes : 



temps : 


1 2 3 4 5 6 




C'est-&-dire : 






temps 1 


unite 





temps 2 


1 fois la base = 1*2 


2 


temps 3 


fois la base fois la base= 0*2*2 


Ci 


temps 4 


1 fois .... = 1*2*2*2 


8 


temps 5 


1 fois .... = 1*2*2*2*2 


16 


temps 6 


1 fois .... = 1*2*2*2*2*2 


32 


temps 7 


miam... miam ! 


^^^ 



58 



L'avantage de la methode 6tait evident ; elle laissait a I'homme un bras 
libre, ce qui lui permettait d'en changer lorsqu'il y avait beaucoup 
d'aurochs, car dans ce cas-l£, la "transmission" etait longue et fasti- 
dieuse... 

Ainsi, comme vous le voyez, 58 en base 10 et 111010 en base 2 sontdeux 
representations d'un meme nombre (il y en a autant que de bases, c'est-a- 
dire un nombre infini). L'une est la representation decimale, I'autre la 
representation binaire. 

Comme le bras de I'homme de Cromagnon qui ne pouvait prendre que 
deux etats (bras lev£ ou bras baiss6), les informations traitees par 
I'ordinateur seront codees sur le meme principe : 

- Etat : pas de circulation de courant, pas de trou sur une carte ou un 
ruban perfor6, pas de magnetisation sur une cassette ou une disquette. 

- Etat 1 : circulation d'un courant, trou dans une carte ou un ruban 
perfore, magnetisation sur un support magnetique. 



ANNEXE 1 I 249 



Le nombre 58 pourra alors etre represents en binaire sur une carte 
perforee : 






— > 


1 


— > 





— > 


1 


— > 


1 


— > 


1 


— > 




La memoire centrale est formee d'une mosaique de cellules appelees 
bits, chacun d'eux pouvant prendre Tun des deux etats ou 1 (bascule). 

Habituellement, ces bits sont regroupes par huit pour former un octet, et 
la plupart des microprocesseurs utilisent I'adressage octet, ce qui signifie 
que I'on accede simultanement a 8 bits de la memoire, en lecture ou en 
ecriture. 

L'octet peut etre represents ainsi : 



L_J_J__L_L_J_J_J_ 
bit no: 7 6 5 4 3 2 1 




et le nombre 58 pourra etre codS : 



l_ _L°iLL 1 _l]_L L]_L _J 



G 



avec le bit representant le poids faible du nombre, et le bit 7 representant 
le poids fort, la notion de poids dependant essentiellement de la valeur de 
la puissance 2 du rang occupe par chaque bit: 



bit 


— > 2° 


= 1 


bit 1 


— > 2 1 


= 2 


bit 2 


--> 2 2 


= 4 


bit 3 


— > 2 3 


= 8 


bit 4 


— > 2 4 


= 16 


bit 5 


— > 2 5 


= 32 


bit 6 


— > 2 6 


= 64 


bit 7 


— > 2 7 


= 128 



250 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 

Plus le rang est eleve, plus le poids est lourd. Notre nombre 58, dans sa 
representation binaire, a les bits 1,3,4615 positionnesa 1. II est done facile 
de retrouver sa valeur decimale : 



bit 1 — > 2 

bit 3 — > 8 

bit 4 — > 16 

bit 5 — > 32 

58 



A I'inverse, un nombre decimal devra etre divise par les puissances 
successives de 2 (la base) afin de trouver sa configuration binaire. 

Exemple: 133 = 2 7 + 2 2 + 2° = 128 + 4 + 1 

correspondant a : 



l1i_ j. j.°j_ _l1i -L 1 -J 



bits : 7 



Mais cette representation est lourde et encombrante pour I'homme. II a 
done ete decide de couper I'octet en 2 quartets (4 bits) : 



L 1 .L?i_°J.°J L°.iL. _l1j 



et de faire correspondre a chaque quartet 16 symboles differents et 
uniques : 



0000 correspondra a 





0001 


1 


0010 


2 


0011 


3 


0100 


4 


0101 


5 


0110 


6 


0111 


7 


1000 


B 


1001 


9 


1010 correspondra a : 





ANNEXE 1 I 251 

Les symboles numeriques sont epuises ? Qu'a cela ne tienne. Employons 
les alphabetiques : 



1010 correspondra a : 


A 


1011 


B 


1100 


C 


1101 


D 


1110 


E 


1111 


F 



Voiia ! Toutes les combinaisons possibles du quartet ont ete ecrites, et il 
faut s'arreter la. 

Par cette operation, nous venons, sans le savoir (vraiment ?) de passer 
de la base 2 (binaire) a la base 16 (hexadecimale), avec I'avantage d'une 
legere contraction d'ecriture (15 devient F). Tous ces systemes de numera- 
tion ne sont, rappelons-le, que differents modes de representation des 
memes nombres. Le tout est de connaitre la base utilisee. 

Un petit conseil : apprenez par coeur le tableau de correspondance 
binaire/hexadecimal. Allons... ce n'est pas si difficile ! 

Le nombre 58 (base 10) pourra etre represents par 3A en base 16, ce qui 
est tout de meme plus agreable que 00111010..., enfin, chacun ses gouts I 

Bien entendu, au-dela d'un octet, le processus continue : 

LiLlxl,lilLL±LlL£ji.llL°JlL£lltlJ 

14 11 10 6 

correspondra a 4C41 en base 16 (ga, c'est facile), et a : 
2 14 + 2 t1 + 2 10 + 2 6 + 1 en base 10, soit 19521. 
Mais 19521... c'est 76 fois 256 plus 65, 



et 76, c'est <Q fois 16 plus H2J , 



et 65, c'est / © fois 1 




4 C. 4 



Nous venons de repasser en base 16 ! II est ensuite plus facile de 
basculer en base 2 si Ton connait ses classiques : 

4 C 4 1 

I 1 I i 

0100 1100 0100 0001 



252 I GRAPHEMES EN ASSEMBLEUR SUR AMSTRAD 

Puisque nous en sommes au binaire, essayons d'additionner deux 
nombres : 1 + 1 = 2... ? 

Non. En base 2, le 2 n'existe pas. II faut done ajouter une tranche 
supplemental au resultat (comme pour 5 + 5 en base 10) ; 




Essayons encore : 



+ 


©321) 

1 cniriyJTi o o 
° l r 1 r 1 ° 




1 1(1®®°)'' o 



Le microprocesseur ne procede pas differemment pour effectuer une 
addition. En hexadecimal, e'est un peu moins simple, sauf si Ton sait 
compter sur ses doigts... 




On compte comme en base 10, mais au-del£ de 9, on continue par A. II 
n'y a une retenue qu'au-deld de F. 

Un autre type de representation est quelquefois utilise en informatique : 
e'est la representation BCD, qui signifie Decimal Code Binaire (de I'anglais 
Binary Coded Decimal). 

On I'emploie en general dans des programmes executant des operations 
directement en decimal, sans passer par le binaire. 

Les chiffres d§cimaux prennent les valeurs a 9, on fait corresponds, d 
chaque chiffre du nombre, un quartet code ainsi : 

0000 — > 

0001 — > 1 
0010 — > 2 



1001 — > 9 



ANNEXE 1 I 253 

La codification est la meme que pour I'hexadecimal, mais cette fois on 
s'arrete a 9. Ainsi, le nombre 1794 sera represents : 

17 9 4 

• / a / 

0001 0111 1001 0100 



Pour terminer, nous allons dire un mot au sujet des operateurs logiques. 

II existe 4 fonctions logiques frequemment utilisees sur les nombres 
binaires : le NON (NOT), le ET (AND), le OU (OR) et le OU EXCLUSIF (XOR). 



Le NON, nous I'avons deja vu : c'est le complement a 1. Le ET (ou 
intersection logique) de deux nombres binaires s'effectue selon la regie 
suivante : 

et — > 

et 1 — > 

1 et — > 
1 et 1 — > 1 

appliquee a chaque couple de bits de deux nombres a intersecter. 

Exemple : 

10 10 110 1 
ET 11110 11 



10 10 1 



Sous forme hexadecimale, nous ecrirons que : AD AND 7B = 29. Quoi de 
plus simple ? 

Le bit resultant sera a 1 si le bit du premier nombre ET le bit du second 
nombre sont a 1. 



Le OU (ou reunion logique) obeit a la regie : 

et — > 

et 1 — > 1 

1 et — > 1 

1 et 1 — > 1 

Exemple : 

10 10 110 1 
OU 110 10 1 



1110 110 1 



que Ton peut aussi ecrire : AD OR C5 = ED en hexadecimal. Le bit resultant 
sera & un si le bit du premier nombre OU le bit du second nombre est a 1. 



254 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 

Le OU exctusif (ou disjonction logique) obeit a la meme regie que le 
precedent, sauf pour la derniere condition : 

et — > 

et 1 — > 1 

1 et — > 1 

1 et 1 — > 

Pour que le bit resultant soit a 1 , il faut done que le bit du premier nombre 
OU le bit du second nombre soit a 1, mais pas les deux en meme temps. 

Exemple : 

10 1110 1 
OU EX 110 10 



110 10 1 



Annexe 2 



Les adresses systemes utiles 



Sont regroupes ci-dessous les appels de routines systemes concernant la 
gestion des graphismes et des entrees utilisateur (clavier, joystick...). 
Toutes ne sont pas presentes, pour une raison d'encombrement et de 
simplification. II s'agit des routines principales. Elles sont mises en ceuvre 
par un simple CALL a I'adresse indiquee, apres avoir eventuellement 
rempli les registres necessaires. L'ouvrage Clefs pour t'Amstrad de Daniel 
Martin (Editions du P.S.I.) contient la liste complete des routines systemes 
et leurs entrees et sorties. Le manuel Firmware d'Amsoft est egalement 
disponible, et fournit une explication plus detaillee des routines et du 
systeme, mais en anglais. 

□ #BB06 : attend un caractere au clavier ; 

SORTIE : le registre A contient le code ASCII du caractere 
tape ; 

le flag Carry vaut 1 ; 
les flags sont modifies. 

D #BB09 : regarde si caractere est disponible au clavier ; 

SORTIE : si Carry=1, A contient le code du caractere ; 
si Carry=0, il n'y avait pas de caractere ; 

les flags sont modifies. 



256 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 



D#BB18 



D #BB1B 



□ #BB1E 



D #BB24 



D #BBCO 



D #BBC3 



D #BBC6 



D #BBDB 



H #BBDE 



: attend qu'une touche soit appuyee au clavier. 
SORTIE : Carry=1 

A contient le caractere associe a la touche ; 
flags modifies. 

: regarde si une touche est appuyee ; 
SORTIE : si Carry=1, A contient le caractere associe; 
si Carry=0, il n'y avait pas de touche ; 
flags modifies. 

: teste si une touche donnee est appuyee ; 
ENTREE : numero de la touche ; 
SORTIE : flag Z=0 si la touche etait appuyee, 1 sinon ; 

A et HL modifies ; 

flags modifies. 

: renvoie I'etat du joystick. 
SORTIE : H et A = joystick 
L = joystick 1 

Les bits de I'octet etat indiquent : 
b0=1 si direction haut 
b1=1 si direction bas 
b2=1 si direction gauche 
b3=1 si direction droite 
b4=1 si bouton tir 2 
b5=1 si bouton tir 1 
Les flags sont modifies. 

MOVE se positionne sur un point graphique ; 
ENTREE : DE contient la coordonnee x sur 16 bits 

HL contient y ; 
SORTIE : AF, BC, DE, HL modifies (flags modifies). 

MOVER se deplace graphiquement ; 

ENTREE : DE contient le depiacement sur x en nombre de 

points ; 

HL contient le depiacement sur y ; 
SORTIE : AF, BC, DE, HL modifies (flags aussi). 

renvoie ie point de localisation actuel ; 
SORTIE : DE contient x ; 

HL contient y ; 

AF modifie (flags aussi). 

efface la fenetre graphique. 

SORTIE : AF,BC,DE,HL modifies (et flags) ; 

le point actuel est piac'e sur I'origine (0,0). 

selectionne le stylo utilise pour les traces graphiques ; 
ENTREE : A contient le numero de stylo ; 
SORTIE : AF et flags modifies. 



ANNEXE 2 I 257 



□ #BBE1 : renvoie le numero du stylo graphique ; 

SORTIE : A contient le numero ; 
flags modifies. 

□ #BBE4 : selectionne le numero de stylo utilise pour le fond gra- 

phique ; 

ENTREE : A contient le numero de stylo ; 

SORTIE : A et flags modifies. 

D #BBEA : PLOT colorie un point; 

ENTREE : DE contient x ; 
HL contient y ; 
SORTIE : AF,BC,DE,HL et flags modifies. 

□ #BBED : PLOTR colorie un point apres deplacement; 

ENTREE : DE contient deplacement sur x ; 

HL deplacement sur y ; 
SORTIE : AF,BC,DE,HL et flags modifies. 

D#BBFO : TEST renvoie le numero de stylo d'un point ; 

ENTREE : DE contient x ; 
HL contient y ; 
SORTIE : A contient le numero de stylo ; 
BC,DE,HL et flags modifies. 

D #BBF3 : TESTR renvoie stylo d'un point apres deplacement ; 
ENTREE : DE deplacement sur x ; 
HL deplacement sur y ; 
SORTIE : A contient numero de stylo ; 
BC,DE,HL et flags modifies. 

□ #BBF6 : DRAW trace une ligne du point actuel a un point specifie ; 

ENTREE : DE contient x du point vise ; 
HL contient y du point vise ; 
SORTIE ; AF,BC,DE,HL et flags modifies. 

□ #BBF9 : DRAWR deplacement et trace jusqu'a un point ; 

ENTREE : DE deplacement sur x ; 
HL deplacement sur y ; 
SORTIE : AF,BC,DE,HL et flags modifies. 

□ #BCOE : MODE positionne t'ecran dans un mode de resolution ; 

ENTREE : A contient le mode voulu (0,1 ou 2) ; 

SORTIE : AF,BC,DE,HL et flags perdus ; 

les couleurs associees aux stylos ne sont pas modifiees. 

D #BC11 : renvoie le mode actuel de resolution ; 

SORTIE : A contient numero de mode ; 

Carry=1 si mode=0 / Carry=0 si mode 1 ou 2 ; 
Z=1 si mode=1, Z=0 si mode ou 2 ; 
Flags modifies. 



258 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 

D #BC20 : caicule I'adresse ecran placee a droite de I'actuelle, compte 
tenu des scrollings decalant I'adresse de debut ; 
ENTREE : HL contient I'adresse ecran originale ; 
SORTIE : HL recalcule ; 
AF est modifie. 

Q #BC23 : idem BC20, mais decale vers la gauche. Memes entr6e et 
sortie que BC20. 

D #BC26 : idem, mais caicule I'adresse de I'octet en dessous. 

D #BC29 : idem pour I'octet au-dessus. 

□ +BC32 : modification des couleurs d'un stylo ; 

ENTREES : A contient le numero de stylo ; 

B contient le numero de la premiere couleur ; 

C contient le numero de la seconde couleur ; 
SORTIES : les registres AF,BC,DE,HL sont modifies. 

D #BC38 : modification des couleurs du bord de I'ecran ; 

ENTREES : comme BC32 sauf A, pas pris en compte ; 
SORTIE : idem BC32. 

□ #BC5F : HORLIN ; trace une ligne horizontale ; les coordonnees 

sont celies de points physiques et non logiques ; le 

masque d'encre peut etre obtenu par appel de INKCOD 

(#BC2C). 

ENTREES : A masque de 1'encre ; 

BC abscisse droite du segment ; 

DE abscisse gauche du segment ; 

HL ordonnee du segment; 
SORTIE : AF,BC,DE et HL sont modifies. 

D#BC62 : VERLIN ; idem HORLIN, mais trace une ligne verticale ; 

ENTREE : A masque de I'encre ; 

BC ordonnee haute du segment ; 

DE abscisse du segment ; 

HL ordonnee basse du segment ; 
SORTIES : AF,BC,DE et HL modifies. 

□ #BC2C : INKCOD; change un numero de stylo en son masque; 

ENTREE : A numero de stylo ; 
SORTIE : A masque du stylo ; 
AF est modifie. 



Annexe 3 



Couleurs et masques 



Chaque stylo peut etre associe d une des 27 couleurs disponibles. Cette 
association est totalement independante du contenu de I'ecran : celui-ci ne 
change pas f meme si un stylo est modifie. Seul I'ecran temoigne de la 
nouvelle couleur choisie, tous les points traces avec ce stylo I'adoptant. II 
suffit, apres avoir ^initialise I'Amstrad, d'effectuer una instruction 
"INK 0,0" pour le constater. Le fond de I'ecran devient noir au lieu du bleu 
initial. C'est la seuie modification rSeile (ie contenu de la memoire ecran ne 
change pas). 

En RAM-ecran, les points sont associes a un numero de stylo. Le chapttre 
1 explique comment les bits de chaque point sont entrelaces dans un octet, 
suivant le mode de resolution. 

Les entrelacements, d'apparence si compliquee, ne le sont pas tant que 
cela. En effet, si Ton isole chaque point d'un octet, on constate que la 
repartition des bits est la meme ; seule la position dans I'octet varie. Ainsi, 
pour le mode 1, si le point considere est trace en stylo 3 (binaire 11), on 
obtient le contenu d'octet 00010001 si le point est celui plac6 d droite ; 
00100010, s'il est un peu plus a gauche, et ainsi de suite. Ces combinaisons 
el6mentaires de bits, ou un seul point est allume, sont appelees des 
MASQUES. Ce nom leur vient de I'utilite qu'elles representent. En effet, en 
prenant le contenu d'un octet "AND" avec ce masque, on recupere la 



260 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 

couleur du seul point correspondent. Supposons par exemple que nous 
devions connaitre, en mode 1, quel est !e stylo du point situe le plus S 
gauche. 

11010101 (contenu de I'ecran, quelconque a priori) 
AND 10001000 (masque du point de gauche en mode 1) 

10000000 (masque associe au stylo 1 en mode 1) 

Cet exempie nous amene & dissocier deux types de masques. Les 
masques de points sont les masques cites ci-dessus : tous les bits du point 
sont positionnes & 1, les autres & zero. Les masques de couleur repondent a 
la meme logique : seuls les bits 1 du stylo sont positionnes a 1 dans le 
masque. 

Le tableau suivant resume, pour chaque mode, les masques de points et 
de stylos en binaire, en hexadecimal et en decimal, lis sont donnes pour le 
point de droite uniquement. Pour chaque decalage a gauche du point 
voulu, il suffit de multiplier par deux la valeur donnee. Par exemple, le 
masque du point de droite en mode 2 est 1. Pour avoir celui du point de 
gauche (sept points plus loin), II suffit de multiplier 7 fois par 2, ce qui 
donne 128. 

II faut egalement noter que ie stylo se caracterise par un masque egal a 
zero, quels que soient le mode et le point concern^s. D'autre part, le 
masque de point est exactement le meme que celui du dernier stylo 
disponible. 



MASQUE 


MODE 


MODE 1 


MODE 2 


point 


bin 01010101 
hex 55 
dec 85 


bin 00010001 
hex 11 
dec 17 


bin 00000001 
hex 01 
dec 1 


stylo 
(fond) 


bin 00000000 
hex 00 
dec 


bin 00000000 
hex 00 
dec 


bin 00000000 
hex 00 
dec 


stylo 1 


bin 01000000 
hex 40 
dec 64 


bin 00010000 
hex 10 
dec 16 


bin 00000001 
hex 01 
dec 1 


stylo 2 


bin 00000100 
hex 04 
dec 4 


bin 00000001 
hex 01 
dec 1 




stylo 3 


bin 01000100 
hex 44 
dec 68 


bin 00010001 
hex 11 
dec 17 




stylo 4 


bin 00010000 
hex 10 
dec 16 







ANNEXE 3 I 261 



stylo 5 


bin 01010000 
hex 50 
dec 80 






stylo 6 


bin 00010100 
hex 14 
dec 20 






stylo 7 


bin 01010100 
hex 54 
dec 84 






stylo 8 


bin 00000001 
hex 01 
dec 1 


■ 




stylo 9 


bin 01000001 
hex 41 
dec 65 






stylo 10 


bin 00000101 
hex 05 
dec 5 






stylo 11 


bin 01000101 
hex 45 
dec 69 






stylo 12 


bin 00010001 
hex 11 
dec 17 






stylo 13 


bin 01010001 
hex 51 
dec 81 






stylo 14 


bin 00010101 
hex 15 
dec 21 






stylo 15 


bin 01010101 
hex 55 
dec 85 







Annexe 4 



Carte memoire Amstrad 



Les Amstrad, quel que soit leur modele, utilisent tous la meme carte 
memoire (en tout cas en ce qui concerne les modeies 464, 664 et 6128). 
Leurs donnees systeme, blocs de vecteurs et autres limites de la memoire 
utilisateur sont les memes. Cela signifie que la capacite memoire des trois 
modeies est identique, que I'ecran se trouve au meme emplacement, etc. II 
s'agit deja d'une grande garantie de compatibility 

II convient de noter que I'Amstrad poss6de une organisation en ROM 
sup^rieures qui peut egalement s'etendre £ de la RAM (c'est ce qui a ete fait 
sur le 6128). Ces ROM ou RAM paralleles sont des blocs de 16 Ko situes en 
#C000. II y a deux contraintes a respecter pour les utiliser : on ne peut 
acceder qu'a un seul bloc a la fois (quoi qu'il arrive, le Z-80 ne peut adresser 
que 64 Ko, pas un de plus, ni 16). Et surtout, les blocs de donnees ou de 
controle situes dans les 48 Ko restants ne doivent en aucun cas etre ecrases 
si Ton veut g6rer ces ROM/RAM. 

Un bon exemple de ces contraintes : I'addition d'un lecteur de disquettes 
d un CPC 464 provoque une diminution de la RAM disponible. En effet, les 
routines de gestion du lecteur sont situees dans une ROM parallele, et un 
bloc de donnees supplementaires destine a sa gestion vient prendre place 
dans la RAM utilisateur, reduisant celle-ci d'autant. Sur 664 et 6128, cette 
operation est effectuee d'office, le lecteur etant integr6, ainsi que sa ROM 
de controle. On peut de nouveau constater le phenomene sur 6128 en 



ANNEXE 4 i 263 

mettant en place le programme "Bank Manager" livre sur la disquette 
systeme, programme dont le role est d'assurer la gestion des 64 Ko 
supplementaires. Les routines se placent elles aussi en RAM, et la zone 
utilisateur diminue done (les 64 Ko paralleles ne sont pas programmables 
tels quels, mais on peut les utiliser comme un "lecteur de disquettes" 
supplemental). 

L'Amstrad possede egalement une autre ROM parallele, situee de #0000 
a #2FFF. Cette ROM "basse" conlient le systeme d'exploitation et ses 
routines, et possede un bloc de donn6es en RAM. Ce bloc est de loin le plus 
important et ne doit en aucun cas etre perdu, sauf si, evidemment, 
I'application envisagee fournit ses propres routines systemes. 

Les extensions "RSX" brievement evoqu6es dans I'ouvrage prennent 
place en RAM, ou du moins leurs blocs de controle. 



CARTE DE LA MEMOIRE VIVE 64 Ko 



$0000: 

$003F 
$0040: 

$016F 
$0170: 



$A67B: 



$AB7F 

SAB80: 

$B100 



vecteurs de controle du systeme (interruptions, connexions 
des ROM ou RAM paralleles, etc.). NE DOIT EN AUCUN CAS 
£TRE PERDU !!!!!! 



variables systemes de I'interpreteur Basic. Peut etre ecrase si 
le programme ne necessite ni retour au Basic ni utilisation 
d'une quelconque des routines Basic (mathematiques, par 
exemple). 



DEBUT DE LA RAM UTILISATEUR. Peuvent egalement etre 
placees ici des variables de controle de ROM superieures. 
L'adresse $0170 est alors repoussee par le programme 
d'initialisation de ces eventuelles ROM. 
Une application peut ainsi placer ces variables soit en debut 
de zone libre, soit en fin, au choix. 

FIN DE LA RAM UTILISATEUR sur un appareil avec lecteur de 
disquettes. La zone de cette adresse a $AB7F peut etre utilisee 
sur un 464 sans lecteur. La connexion de ROM supplemen- 
taires ou d'extensions RSX diminue cette adresse en fonction 
de leurs besoins. 



zone de variables systemes Basic. Peut etre ecrase si le 
programme ne necessite ni retour au Basic ni utilisation 
d'une de ses routines. 



264 I GRAPHISMES EN ASSEMBLEUR SUR AWSTRAD 



SB101: 

$B8FF 

$B900 

$BAFF 

$8 BOO: 



$BDFF 

$BE00: 
$BFFF 

$C0D0: 



$FFFF 



zone de variables systemes utiiisees par le systeme Sexploi- 
tation. Peut etre ecras6 si le programme se passe de celui-ci. 



bloc de vecteurs systemes. Permettent de selectionner les 
ROM paralteles, la ROM basse, etc. EVITER D'Y TOUCHER. 



bloc des vecteurs. S'y trouvent tous les vecteurs des routines 
systemes, mathematiques, etc. Ce bloc fournit ainsi un appel 
simple pout toute la gestion des ressources (graphismes, 
sons, interruptions...) et on evitera de le modifier. Chaque 
vecteur pointe sur une routine d'une ROM. II est possible de 
modifier un vecteur afin qu'il pointe sur une autre routine. II 
n'est pas non plus interdit d'ecraser purement et simplement 
ce bloc. Dans ce cas, le programme devra soit fournir ses 
propres routines systemes (gestion des graphismes, du 
son...), soit appeler directement les routines voulues en ROM 
grace au bloc $B900-$BAFF. 



zone reservee a la pile. 



RAM-Ecran. 384 octets de cette RAM ne sont pas visualises et 
peuvent done etre recuperes si besoin est. Mais ils sont 
effaces au premier CLS et deplaces en cas de scrolling. 



Annexe 5 
Carte memoire des routines 



Les routines en assembleur du livre sont placees de fagon a ne pas se 
chevaucher. II est done possible de les charger en memoire simultanement. 
C'est de plus necessaire pour certains programmes d'application. 

La totalite des routines est disponible sous forme de DATA Basic dans un 
programme, au moins une fois dans le livre. Une fois le programme en 
question execute, il est done possible de sauvegarder la routine de la fagon 
suivante : 

SAVE "nom de la routine'\b,adresse depart,adresse fin-adresse 
depart+1. 

Cette annexe resume done les adresses de debut et de fin de chaque 
routine du livre. 



LISTE DES PROGRAMMES DU LIVRE 



Chaque programme comporte une reference indiquant son type : 

- PROGn.m : il s'agit du programme Basic "m" du chapitre "n". 

- PROGn.mAS : il s'agit du programme assembleur "m" du chapitre "n" 



266 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 



1.1 : acces direct £ la memoire ecran ; 

1.2 : calcul d'un octet de la memoire ecran ; 

1.3 : mouvement simul6 par modification de couleurs ; 

1.4 : remplissage de l'6cran en Basic par points; 

1.5 : remplissage de I'ecran en Basic par acces memoire; 

1.6 : remplissage en LM par points; 
1.6as : routine du programme 1.6, 

1.7 : remplissage en LM par acces memoire ; 
1.7as : routine du programme 1.7; 

2.1 : addition en LM interfacee avec le Basic; 
2.1as : routine du programme 2.1 ; 

2.2 : addition en LM chronometree ; 

2.3 : addition en Basic chronometree ; 

2.4 : soustraction en LM interfacee avec le Basic ; 
2.4as : routine du programme 2.4 ; 

3.1 : trace de cercles optimise en Basic par points ; 

3.2 : trace de cercles optimise en LM par points ; 
3.2as : routine du programme 3.2 ; 

3.3 : trace de cercles optimise en LM par lignes ; 
3.3as : routine du programme 3.3 ; 

3.4 : trace d'histogrammes en Basic ; 

3.5 : trace d'histogrammes en LM ; 
3.5as : routine du programme 3.5 ; 

3.6 : remplissage de zone quelconque en Basic ; 

3.7 : remplissage de zone quelconque en LM ; 
3.7as : routine du programme 3.7 ; 

image : creation de I'image ecran servant de d6cor aux routines ; 

4.1 as : restitution simple d'un objet a I'ecran ; 

4.2as : stockage simple d'une zone ecran en memoire ; 

4.3 : codage en memoire d'un module (utilise 4.2as) par dessin ; 
4.3b : codage en memoire d'un robot par POKE ; 

4.3c : codage en memoire d'une bete par POKE ; 

4.4 : animation du module (utilise 4.1as) ; 

4.4b : animation du robot (utilise 4.1 as) (modifications de 4.4) ; 

4.4c : animation de la bete (utilise 4.1as) (modifications de 4.4); 

5.1 : compactage d'un objet graphique ; 
5.1as : routine du programme 5.1 ; 

5.2 : restitution ecran d'un objet compacte ; 
5.2as : routine du programme 5.2 ; 

6.1as : deplacement par joystick d'un objet; 

6.2 : application du programme 6.1as ; 

6.2b : idem 6.2 ; 

6.2c : idem 6.2 ; 

7.1 : restitution d'un objet en mode XOR ; 

7.1b : idem 7.1 ; 



ANNEXE 5 I 267 

7.1c : idem 7.1 ; 

7.1as : routine du programme 7.1 ; 

7.2as : restitution d'un objet sur decor ; 

7.3 : application du programme 7.2as ; 
7.3b : idem 7.3 ; 

7.3c : idem 7.3 ; 

7.4 : restitution d'un objet sur decor et sous avant-plans ; 
7.4b : idem 7.4 ; 

7.4c : idem 7.4 ; 

7.4as : routine du programme 7.4 ; 

8.1 : deplacement d'un objet par coordonndes et joystick ; 

8.1b : idem 8.1 ; 

8.1c : idem 8.1 ; 

8.1as : routine du programme 8.1 ; 

8.2as ; detection de collision entre deux objets ; 

8.3 : deplacement complet ; 
8.3b : idem 8.3 ; 

8.3c : idem 8.3 ; 

8.3as : gestion des territoires interdits ; 

8.4 : deplacement automatique du module (decor, avant-plans, terri- 
: toires) ; 

8.4b : idem 8.4 ; 

8.4c : idem 8.4 ; 

8.4as routine du programme 8.4. 



EMPLACEMENT DES ROUTINES LM DU LIVRE 



Si Ton excepte les routines des premiers chapitres, tous les programmes 
assembleur du livre sont compatibles entre eux et peuvent etre charges 
ensemble en memoire. Les adresses ci-dessous permettent, une fois un 
programme d'application execute, de sauver les routines dans un fichier 
binaire (grace a I'instruction SAVE dScrite plus haut). 

Quelques-uns des programmes d'application de ce livre (notamment 
dans les derniers chapitres) necessitent le chargement de routines par le 
biais de fichiers binaires. Par exemple, I'instruction suivante : 

LOAD "prog4.1ob" 

suppose que vous avez prealablement sauvegarde le programme 4.1 sous 
ce nom et 3 partir des adresses de debut et de fin indiqu6es ci-dessous en 
hexadecimal. 



268 I GRAPHISMES EN ASSEMBLEUR SUR AWSTRAD 

Les routines ainsi reutilisees dans des programmes sont signalees ci 
dessous par une etoile. 



Routine 


Adresse 


Adresse 


numero 


debut 


fin 


1.6 


$4000 


$4033 


1.7 


$4000 


$400C 


2.1 


$4000 


$4017 


2.4 


$4000 


$4019 


3.2 


$4000 


$41 1D 


3.3 


$4000 


$4173 


3.5 


$4200 


$446B 


3.7 


$5000 


$5308 


4.1 (*) 


$4700 


$47 1E 


4.2 (•) 


$4730 


$4750 


5.1 


$4500 


$4599 


5.2 


$4600 


$4647 


6.1 (*) 


$4C00 


$4C77 


7.1 


$4800 


$481 F 


7.2 


$4830 


$4852 


7.4 (*) 


$4760 


$47CA 


8.1 (*) 


$489C 


$492F 


8.2 (*) 


$4950 


$498C 


8.3 (*) 


$49A0 


$49C8 


8.4 


$4A0O 


$4ACF 



VARIABLES GLOBALES 



Les routines des chapitres 4 & 8 utiiisent une zone de variables commune. 
Ces variables sont r6sumees ci-dessous avec leur nom courant. Certaines 
possedent deux noms, suivant la routine. Toutes les adresses ci-dessous 
signages par " — " sont utilisees comme poids fort de la variable au- 
dessus, celle-ci etant alors au format 16 bits. 



Adresse 


Variable 


hexa. 




459A 


: BUFAC 


459B 





459C 


: BUF / BUFFER 


459D 





459E 


': LIGNE 


459F 





45A0 


: ECRAN 


45A1 


— 


45A2 


: COUNT 


45A3 


: REPEAT 







ANNEXE 


45A4 


OCTREF 




45A5 


LECTUR 




45A6 


LAR 




45A7 


HAU 




45A8 


X 




45A9 


Y 




45AA 


LAR / X 




45AB 


HAU / Y 




45AC 


X1 




45AD 


Y1 




45AE 


LAR1 




45AF 


HAU1 




45B0 


COLLI 




45B1 


TABLE 




45B2 






45B3 


XO 




45B4 


YO 




45B5 


ECRANO 




45B6 






45B7 


ECRAN2 




45B8 






45B9 


BUFFER 




45BA 






45BB 


DESSIN 




45BC 






45BD 


JOYST 





5 I 269 



Annexe 6 
Structure ecran de I ' Amstrad 



L'ecran est compose de 200 lignes. Chaque ligne est codee avec 80 octets 
successifs, quel que soit le mode. L'adresse de depart de l'ecran est $C000 
(sauf apres un scrolling de texte, que nous supposons nul). II s'y trouve le 
1 6r octet (gauche) de la premiere ligne (haut). Ensuite, les adresses des 
premiers octets de chaque ligne sont places aux adresses indiqu6es ci- 
dessous, exprimees en hexadecimal. Les deux numeros places h gauche 
des adresses permettent de trouver l'adresse d'une ligne, que le haut de 
l'ecran soit note 1 ou 200. 



Ligne - adresse 



200 


1 


cooo 


199 


2 


C800 


198 


3 


D000 


197 


4 


D800 


196 


5 


E000 


195 


6 


E800 


194 


7 


F000 


193 


8 


F800 


192 


9 


C050 


191 


10 


C850 


190 


11 


D050 


189 


12 


D850 



ANNEXE 6 I 271 



188 


13 


E050 


187 


14 


E850 


186 


15 


F050 


185 


16 


F850 


184 


17 


COAO 


183 


18 


C8A0 


182 


19 


DOAO 


181 


20 


D8A0 


180 


21 


EOAO 


179 


22 


E8A0 


178 


23 


FOAO 


177 


24 


F8A0 


176 


25 


COFO 


175 


26 


C8F0 


174 


27 


DOFO 


173 


28 


D8F0 


172 


29 


EOFO 


171 


30 


E8F0 


170 


31 


FOFO 


169 


32 


F8F0 


168 


33 


C140 


167 


34 


C940 


166 


35 


D140 


165 


36 


D940 


164 


37 


E140 


163 


38 


E940 


162 


39 


F140 


161 


40 


F940 


160 


41 


C190 


159 


42 


C990 


158 


43 


D190 


157 


44 


D990 


156 


45 


E190 


155 


46 


E990 


154 


47 


F190 


153 


48 


F990 


152 


49 


C1E0 


151 


50 


C9E0 


150 


51 


D1E0 


149 


52 


D9E0 


148 


53 


E1E0 


147 


54 


E9E0 


146 


55 


F1E0 


145 


56 


F9E0 


144 


57 


C230 


143 


58 


CA30 


142 


59 


D230 


141 


60 


DA30 






272 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 






140 


61 


E230 


139 


62 


EA30 


138 


63 


F230 


137 


64 


FA30 


136 


65 


C280 


135 


66 


CA80 


134 


67 


D280 


133 


68 


DA80 


132 


69 


E280 


131 


70 


EA80 


130 


71 


F280 


129 


72 


FA80 


128 


73 


C2D0 


127 


74 


CADO 


126 


75 


D2D0 


125 


76 


DADO 


124 


77 


E2D0 


123 


78 


EADO 


122 


79 


F2D0 


121 


80 


FADO 


120 


81 


C320 


119 


82 


CB20 


118 


83 


D320 


117 


84 


DB20 


116 


85 


E320 


115 


86 


EB20 


114 


87 


F320 


113 


88 


FB20 


112 


89 


C370 


111 


90 


CB70 


110 


91 


D370 


109 


92 


DB70 


108 


93 


E370 


107 


94 


EB70 


106 


95 


F370 


105 


96 


FB70 


104 


97 


C3C0 


103 


98 


CBCO 


102 


99 


D3C0 


101 


100 


DBCO 


100 


101 


E3C0 


99 


102 


EBCO 


98 


103 


F3C0 


97 


104 


FBCO 


96 


- 105 


C410 


95 


106 


CC10 


94 


107 


D410 


93 


108 


DC10 









ANNEXE 6 


92 


109 


E410 




91 


110 


EC10 




90 


111 


F410 




89 


112 


FC10 




88 


113 


C460 




87 


114 


CC60 




86 


115 


D460 




85 


116 


DC60 




84 


117 


E460 




83 


118 


EC60 




82 


119 


F460 




81 


120 


FC60 




80 


121 


C4B0 




79 


122 


CCBO 




78 


123 


D4B0 




77 


124 


DCBO 




76 


125 


E4B0 




75 


126 


ECBO 




74 


127 


F4B0 




73 


128 


FCBO 




72 


129 


C500 




71 


130 


CDOO 




70 


131 


D500 




69 


132 


DDOO 




68 


133 


E500 




67 


134 


EDOO 




66 


135 


F500 




65 


136 


FDOO 




64 


137 


C550 




63 


138 


CD50 




62 


139 


D550 




61 


140 


DD50 




60 


141 


E550 




59 


142 


ED50 




58 


143 


F550 




57 


144 


FD50 




56 


145 


C5A0 




55 


146 


CDAO 




54 


147 


D5A0 




53 


148 


DDAO 




52 


149 


E5A0 




51 


150 


EDAO 




50 


151 


F5A0 




49 


152 


FDAO 




48 


153 


C5F0 




47 


154 


CDFO 




46 


155 


D5F0 




45 


156 


DDFO 




44 


157 


E5F0 





273 



] 



274 i GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 



43 


158 


EDFO 


42 


159 


F5F0 


41 


160 


FDFO 


40 


161 


C640 


39 


162 


CE40 


38 


163 


D640 


37 


164 


DE40 


36 


165 


E640 


35 


166 


EE40 


34 


167 


F640 


33 


168 


FE40 


32 


169 


C690 


31 


170 


CE90 


30 


171 


D690 


29 


172 


DE90 


28 


173 


E690 


27 


174 


EE90 


26 


175 


F690 


25 


176 


FE90 


24 


177 


C6E0 


23 


178 


CEEO 


22 


179 


D6E0 


21 


180 


DEEO 


20 


181 


E6E0 


19 


182 


EEEO 


18 


183 


F6E0 


17 


184 


FEEO 


16 


185 


C730 


15 


186 


CF30 


14 


187 


D730 


13 


188 


DF30 


12 


189 


E730 


11 


190 


EF30 


10 


191 


F730 


9 


192 


FF30 


s 


193 


C780 


7 


194 


CF80 


6 


195 


D780 


b 


196 


DF80 


4 


197 


E780 


3 


198 


EF80 


2 


199 


F780 


1 


200 


FF80 



Annexe 7 



Le jeu d' instruction du Z-80 



Pour la petite histoire, voici comment cette liste a ete creee. 

a. Un programme BASIC, partant de la racine de chaque mnemonique, va 
produire la famille correspondante. 

Exemple : LD <SR>,<SR> 

(SR represente les simples registres), va creer tous les codes : LD AA LD 

A,B ... LD L,L 

Le fichier ainsi constitue est place sur disque. 

b. Tri du fichier par ordre croissant. 

c. Numerotation des instructions (programme BASIC). 

d. Assemblage du fichier pour generer le code machine (listing sur fichier 
disque). 

e. Suppressions des numeros de lignes (devenus inutiles) par programme 
BASIC. 

f. Alteration du code machine (dd, nn, etc.) par un logiciel de traitement de 
texte. 

g. Disposition du texte en deux colonnes de 60 lignes par page (pro- 
gramme BASIC). 

h. Edition de la liste (voir ci-apres). 



276 I GRAPHEMES EN ASSEMBLEUR SUR AMSTRAD 



Les symboles employes ont ia signification suivante : 
dd : valeur de deplacement signee sur 8 bits, 

N : valeur de 8 bits de I'operande, 

nn : valeur de 8 bits dans le code machine, 

ADR : label d'adresse en operande, 
aaaa : valeur d'adresse sur 16 bits dans le code machine (poids faibles + 

poids forts), 
DEPL : deplacement dans I'operande des instructions en mode relatif, 
NN : valeur de 16 bits ou adresse dans I'operande, 
nnnn : valeur de 16 bits dans le code machine (poids faibles + poids 
forts). 



0000 


8E 


ADC 


A, (HL) 


* 


0066 


DDCBdd4E 


BIT 


l»(IX+dd) 


0001 


DD8Edd 


ADC 


A7 (IX+dd) 


* 


006A 


FDCBdd4E 


BIT 


l>(IY+dd> 


0004 


FD8Edd 


ADC 


A7<IY+dd> 


ft 


006E 


CB4F 


BIT 


lift 


0007 


8F 


ADC 


A?A 


* 


0070 


CB48 


BIT 


I7B 


0008 


88 


ADC 


A;B 


# 


0072 


CB49 


BIT 


1;C 


0009 


89 


ADC 


A>C 


S 


0074 


CB4A 


BIT 


1;D 


000A 


8A 


ADC 


A>D 


* 


0076 


CB4B 


BIT 


!JE 


000B 


8B 


ADC 


A;E 


* 


0078 


CB4C 


BIT 


liH 


OOOC 


8C 


ADC 


A ? H 


* 


007A 


CB4D 


BIT 


IiL 


000D 


8D 


ADC 


A>L 


* 


007C 


CB56 


BIT 


27 (HL) 


000E 


CEnn 


ADC 


A?N 


K 


007E 


DDCBdd56 


BIT 


27<IX+dd> 


0010 


ED4A 


ADC 


HL7BC 


* 


0082 


FDCBdd56 


BIT 


2? (IY+dd) 


0012 


ED5A 


ADC 


HL7DE 


* 


0086 


CB57 


BIT 


2>A 


0014 


ED6A 


ADC 


HL.7HL 


ft 


0088 


CB50 


BIT 


2;B 


0016 


ED7A 


ADC 


HL7SP 


* 


008A 


CB51 


BIT 


2>C 


0018 


86 


ADD 


A?(HL) 


It 


008C 


CB52 


BIT 


2;D 


0019 


DD86dd 


ADD 


A;(IX+dd) 


X 


008E 


CB53 


BIT 


2;E 


001C 


FD86dd 


ADD 


A><IY+dd) 


* 


0090 


CB54 


BIT 


2;H 


001F 


87 


ADD 


A?A 


* 


0092 


CB55 


BIT 


2;L 


0020 


SO 


ADD 


A7B 


ft 


0094 


CB5E 


BIT 


3; (HL) 


0021 


81 


ADD 


A?C 


# 


0096 


DDCBdd5E 


BIT 


3? (IX+dd) 


0022 


82 


ADD 


A?D 


* 


009A 


FDCBdd5E 


BIT 


3; (IY+dd) 


0023 


83 


ADD 


A7E 


tf 


009E 


CB5F 


BIT 


3>A 


0024 


84 


ADD 


A7H 


* 


00AO 


CB58 


BIT 


3>B 


0025 


85 


ADD 


A7L 


* 


00A2 


CB59 


BIT 


3>C 


0026 


C6nn 


ADD 


A7N 


# 


00A4 


CB5A 


BIT 


3;D 


002S 


09 


ADD 


HL7BC 


K 


00A6 


CB5B 


BIT 


3;E 


0029 


19 


ADD 


HL7DE 


K 


O0A8 


CB5C 


BIT 


3;H 


002A 


29 


ADD 


HL7HL 


* 


OOAA 


CB5D 


BIT 


3;L 


002B 


39 


ADD 


HL7SP 


# 


OOAC 


CB66 


BIT 


47(HL) 


002C 


DD09 


ADD 


IX7BC 


* 


OOAE 


DDCBdd66 


BIT 


47(IX+dd) 


002E 


DD19 


ADD 


IX;DE 


* 


00B2 


FDCBdd66 


BIT 


47 (IY+dd) 


0030 


DD29 


ADD 


IX 7 1 X 


+ 


O0B6 


CB67 


BIT 


4?ft 


0032 


DD39 


ADD 


IX7SP 


X 


00B8 


CB60 


BIT 


4>B 


0034 


FD09 


ADD 


IY7BC 


* 


OOBA 


CB61 


BIT 


4 ? C 


0036 


FD19 


ADD 


IY;DE 


* 


OOBC 


CB62 


BIT 


4>D 


0038 


FD29 


ADD 


IY7IY 


* 


OOBE 


CB63 


BIT 


4?E 


003A 


FD39 


ADD 


IY7SP 


* 


00CO 


CB64 


BIT 


4>H 


003C 


A6 


AND 


(HL) 


* 


00C2 


CB65 


BIT 


4;L 


003D 


DDA6dd 


AND 


(IX+dd) 


* 


O0C4 


CB6E 


BIT 


5i(HL) 


0040 


FDA6dd 


AND 


(IY+dd) 


ft 


00C6 


DDCBdd6E 


BIT 


57(IX+dd) 


0043 


A7 


AND 


A 


* 


OOCA 


FDCBdd6E 


BIT 


57 (IY+dd) 



ANNEXE 7 I 277 



0044 


AO 


AND B 


* 


OOCE 


CB6F 


BIT 


5?A 


0045 


Al 


AND C 


* 


OODO 


CB68 


BIT 


5 ? B 


0046 


A2 


AND D 


* 


00D2 


CB69 


BIT 


5?C 


0047 


A3 


AND E 


* 


00D4 


CB6A 


BIT 


5 ? D 


0048 


A4 


AND H 


* 


00D6 


CB6B 


BIT 


5?E 


0049 


A5 


AND L 


ft 


00D8 


CB6C 


BIT 


5?H 


004A 


E6nn 


AND N 


ft 


OODA 


CB6D 


BIT 


5?L 


004C 


CB46 


BIT ? (HL) 


* 


OODC 


CB76 


BIT 


67 (HL) 


004E 


DDCBdd46 


BIT 0; (IX+dd) 


* 


OODE 


DDCBdd76 


BIT 


6;(IX+dd) 


0052 


FDCBdd46 


BIT 07 (IY+dd) 


8 


00E2 


FDCBdd76 


BIT 


67(IY+dd) 


0056 


CB47 


BIT 0?A 


tf 


0OE6 


CB77 


BIT 


67A 


0058 


CB40 


BIT 07B 


* 


00E8 


CB70 


BIT 


67B 


005A 


CB41 


BIT O7C 


K 


OOEA 


CB71 


BIT 


67C 


005 G 


CB42 


BIT O7D 


K 


OOEC 


CB72 


BIT 


67D 


005E 


CB43 


BIT 0?E 


* 


OOEE 


CB73 


BIT 


6;E 


0060 


CB44 


BIT O7H 


* 


OOFO 


CB74 


BIT 


6>H 


0062 


CB45 


BIT 0>L 


If 


00F2 


CB75 


BIT 


6?L 


0064 


CB4E 


BIT 1?<HL) 


* 


0OF4 


CB7E 


BIT 


7 ? (HL) 


00F6 


DDCBdd7E 


BIT 7; <IX+dd) 


* 


0163 


D9 


EXX 




00FA 


FDCBdd7E 


BIT 77<IY+dd> 


# 


0164 


76 


HALT 


OOFE 


CB7F 


BIT 7?A 


* 


0165 


ED46 


IM ( 


J 


0100 


CB78 


BIT 7?B 


* 


0167 


ED56 


IM 


1 


0102 


CB79 


BIT 7>C 


* 


0169 


ED5E 


im ; 


2 


0104 


CB7A 


BIT 7 ? D 


* 


016B 


ED78 


IN A*(-C> 


0106 


CB7B 


BIT 77E 


* 


016D 


DBnn 


IN A;<N) 


0108 


CB7C 


BIT 7?H 


* 


016F 


ED40 


IN B7<C> 


010A 


CB7D 


BIT 7 ? L 


* 


-0171 


ED48 


IN 


:?(Q) 


010C 


DCaaaa 


CALL C7ADR 


ft 


0173 


ED30 


IN ] 


)7(C) 


010F 


FCaaaa 


CALL M7ADR 


* 


0175 


ED58 


IN I 


I7<C) 


0112 


D4aaaa 


CALL NC7ADR 


* 


0177 


ED60 


IN \ 


^<C) 


0115 


CDaaaa 


CALL ADR 


* 


0179 


ED68 


IN 1 


_7(C) 


0118 


C4aaaa 


CALL NZ7ADR 


# 


017B 


34 


INC 


(HL) 


011B 


F4aaaa 


CALL P?ADR 


ft 


017C 


DD34dd 


INC 


(IX+dd) 


011E 


ECaaaa 


CALL PE7ADR 


ft 


017F 


FD34dd 


INC 


(IY+dd) 


0121 


E4aaaa 


CALL PO7ADR 


* 


0182 


3C 


INC 


A 


0124 


CCaaaa 


CALL Z7ADR 


* 


0183 


04 


INC 


B 


0127 


3F 


CCF 


* 


0184 


03 


INC 


BC 


0128 


BE 


CP (HL) 


* 


0185 


OC 


INC 


C 


0129 


DDBEdd 


CP (IX+dd) 


* 


0186 


14 


INC 


D 


012C 


FDBEdd 


CP (IY+dd) 


ft 


0187 


13 


INC 


DE 


012F 


BF 


CP A 


* 


0188 


1C 


INC 


E 


0130 


B8 


CP B 


ft 


0189 


24 


INC 


H 


0131 


B9 


CP c 


ft 


018A 


23 


INC 


HL 


0132 


BA 


CP D 


* 


018B 


DD23 


INC 


IX 


0133 


BB 


CP z 


* 


018D 


FD23 


INC 


IY 


0134 


BC 


CP H 


I 


018F 


2C 


INC 


L 


0135 


BD 


CP L 


ft 


0190 


33 


INC 


SP 


0136 


FEnn 


CP N 


* 


0191 


EDAA 


IND 




0138 


EDA9 


CPD 


ft 


0193 


EDBA 


INDR 


013A 


EDB9 


CPDR 


ft 


0195 


EDA2 


INI 




013C 


EDA1 


CPI 


K 


0197 


EDB2 


INIR 


013E 


EDB1 


CPIR 


* 


0199 


E9 


JP 


(HL) 


0140 


2F 


CPL 


ft 


019A 


DDE9 


JP 


(IX) 


0141 


27 


DAA 


ft 


019C 


FDE9 


JP 


( IY) 


0142 


35 


DEC (HL) 


* 


019E 


DAaaaa 


JP 


C7ADR 


0143 


DD35dd 


DEC (IX+dd) 


K 


01A1 


FAaaaa 


JP 


I7ADR 


0146 


FD35dd 


DEC (IY+dd) 


* 


01A4 


D2aaaa 


JP 


NC7ADR 


0149 


3D 


DEC A 


* 


01A7 


C3aaaa 


JP 


ADR 


014A 


05 


DEC B 


* 


01AA 


C2aaaa 


JP 


NZ7ADR 



' 



278 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 



014B OB 


DEC 


BC 




* 


01AD F2aaaa 


JP P7ADR 


one od 


DEC 


C 




* 


01B0 EAaaaa 


JP PE?ADR 


014D 15 


DEC 


D 




* 


01B3 E2aaaa 


JP PO7ADR 


014E IB 


DEC 


DE 




* 


01B6 CAaaaa 


JP Z?ADR 


014F ID 


DEC 


E 




* 


01B9 38dd 


JR C7DEPL 


0150 25 


DEC 


H 




* 


01BB 18dd 


JR DEPL 


0151 2B 


DEC 


HL 




ft 


01BD 30dd 


JR NC7DEPL 


0152 DD2B 


DEC 


IX 




ft 


01BF 20dd 


JR NZ7DEPL 


0154 FD2B 


DEC 


IY 




* 


01C1 28dd 


JR Z7DEPL 


0156 2D 


DEC 


L 




# 


01C3 02 


LD (BC)?A 


0157 3B 


DEC 


SP 




* 


01C4 12 


LD <DE)?A 


0158 F3 


DI 






ft 


01C5 77 


LD (HL)?A 


0159 lOdd 


DJNZ DEPL 




•x- 


01C6 70 


LD (HL)?B 


015B FB 


EI 






* 


01C7 71 


LD (HL)iC 


015C E3 


EX 


(SP);HL 




* 


01C8 72 


LD (HL);D 


015D DDE3 


EX 


(SP) 7 IX 




* 


01C9 73 


LD (HD7E 


015F FDE3 


EX 


(SP)>IY 




ft 


01CA 74 


LD <HL)>H 


0161 OS 


EX 


AF>AF' 




ft 


01CB 75 


LD (HL)>L 


0162 EB 


EX 


DErHL 




* 


01CC 36nn 


LD (HL)?N 


01 CE DD77dd 


LD 


(IX+dd) 


A 


ft 


0256 4C 


LD C?H 


01D1 DD70dd 


LD 


(IX+dd) 


B 


* 


0257 4D 


LD C?L 


01D4 DD71dd 


LD 


(IX+dd) 


C 


ft 


0258 OEnn 


LD C?N 


01D7 DD72dd 


LD 


(IX+dd) 


D 


X 


025A 56 


LD D? (HL) 


01DA DD73dd 


LD 


(IX+dd) 


E 


* 


025B DD56dd 


LD D? (IX+dd) 


01DD DD74dd 


LD 


(IX+dd) 


H 


ft 


025E FD56dd 


LD D7(IY+dd) 


01E0 DD75dd 


LD 


(IX+dd) 


L 


* 


0261 57 


LD D;A 


01E3 DD36ddnn 


LD 


(IX+dd) 


N 


ft 


0262 50 


LD D ? B. 


01E7 FD77dd 


LD 


(IY+dd) 


A 


ft 


0263 51 


LD D7C 


01EA FD70dd 


LD 


(IY+dd) 


B 


ft 


0264 52 


LD D?D 


01ED FD71dd 


LD 


(IY+dd) 


C 


ft 


0265 53 


LD D7E 


01FO FD72dd 


LD 


(IY+dd) 


D 


ft 


0266 54 


LD D?H 


01F3 FD73dd 


LD 


(IY+dd) 


E 


ft 


0267 55 


LD D?L 


01F6 FD74dd 


LD 


(IY+dd) 


H 


# 


026S 16nn 


LD D;N 


01F9 FD75dd 


LD 


(IY+dd) 


>L 


ft 


026A ED5Bnnnn 


LD DE? (NN) 


01FC FD36ddnn 


LD 


(IY+dd) 


>N 


X 


026E llnnnn 


LD DE?NN 


0200 32nnnn 


LD 


(NN) ? A 




# 


0271 5E 


LD E/<HL) 


0203 ED43nnnn 


LD 


(NN) ?BC 




* 


0272 DD5Edd 


LD E7(IX+dd) 


0207 ED53nnnn 


LD 


<NN) ?DE 




ft 


0275 FD5Edd 


LD E7(IY+dd) 


020B 22nnnn 


LD 


(NN) ?HL 




ft 


0278 5F 


LD E?A 


020E DD22nnnn 


LD 


(NN) ;IX 




ft 


0279 58 


LD E7B 


0212 FD22nnnn 


LD 


(NN)tlY 




ft 


027A 59 


LD E7C 


0216 ED73nnnn 


LD 


(NN) >SP 




->. 


027B 5A 


LD E;D 


021A OA 


LD 


A;(BC) 




* 


027C 5B 


LD E ? E 


021B 1A 


LD 


AMDE) 




ft 


027D 5C 


LD E7H 


021C 7E 


LD 


A7(HL) 




« 


027E 5D 


LD E?L 


021D DD7Edd 


LD 


A?(IX+dd) 


+ 


027F lEnn 


LD E ? N 


0220 FD7Edd 


LD 


A*(IY+dd) 


ft 


0281 66 


LD H;(HL) 


0223 3Annnn 


LD 


A;(NN) 




ft 


0282 DD66dd 


LD H? (IX+dd 


0226 7F 


LD 


A;A 




ft 


0285 FD66dd 


LD H?< IY+dd 


0227 78 


LD 


A>B 




* 


0288 67 


LD H7A 


0228 79 


LD 


A;C 




* 


0289 60 


LD H7B 


0229 7A 


LD 


A?D 




ft 


028A 61 


LD H?C 


022A 7B 


LD 


ArE 




+ 


028B 62 


LD H>D 


022B 7C 


LD 


A;H 




1 


028C 63 


LD H7E 


022C ED57 


LD 


A?I 




+ 


028D 64 


LD H7H 


022E 7D 


LD 


A?L 




* 


028E 65 


LD H;L 


D22F 3Enn 


LD 


A?N 




» 


028F 26nn 


LD H7N 


0231 ED5F 


LD 


A?R 




* 


0291 2Annnn 


LD HL?(NN) 


0233 46 


LD 


B7(HL) 




* 


0294 21nnnn 


LD HL7NN 















ANNEXE 7 1 279 


0234 


DD46dd 


LD B? (IX+dd) 


* 


0297 


ED47 


LD I 


r'A 


0237 


FD46dd 


LD B? (IY+dd) 


* 


0299 


DD2Annnn 


LD IX; (NN) 


023A 


47 


LD B?A 


* 


029D 


DD2innnn 


LD IX7NN 


023B 


40 


LD B?B 


* 


02A1 


FD2Annnrv 


LD IY;(NN) 


023C 


41 


LD BjC 


* 


D2A5 


FD21nnnn 


LD IY7NN 


023D 


42 


LD B?D 


# 


02A9 


6E 


LD L 


ilHL) 


023E 


43 


LD B;E 


ft 


02AA 


DD6Edd 


LD L 


?(IX+dd) 


023F 


44 


LD B>H 


ft 


02AD 


FD6Edd 


LD L 


7 (IY+dd) 


0240 


45 


LD B;L 


ft 


02BO 


6F 


LD L 


7A 


0241 


06nn 


LD B;N 


ft 


02B1 


68 


LD L 


;B 


0243 


ED4Bnnnn 


LD BC ? (NN) 


* 


02B2 


69 


LD L 


;C 


0247 


Olnnnn 


LD BCrNN 


N 


02B3 


6A 


LD L 


7D 


024A 


4E 


LD C> (HL) 


* 


02B4 


6B 


LD L 


7E 


024B 


DD4Edd 


LD C? (IX+dd) 


* 


02B5 


6C 


LD L 


7H 


024E 


FD4Edd 


LD C7(IY+dd> 


ft 


02B6 


6D 


LD L 


*L 


0251 


4F 


LD C ? A 


* 


02B7 


2Enn 


LD L 


»-N 


0252 


48 


LD C;B 


ft 


02B9 


ED4F 


LD R 


7A 


0253 


49 


LD C ? C 


ft 


02BB 


ED7Bnnnn 


LD SP;(NN) 


0254 


4A 


LD C;D 


V 


02BF 


F9 


LD SP>HL 


0255 


4B 


LD C?E 


* 


02CO 


DDF9 


LD SP;IX 


02C2 


FDF9 


LD SP;IY 


ft 


0334 


CB8B 


RES 


liE 


02C4 


31nnnn 


LD SP;NN 


* 


0336 


CB8C 


RES 


I7H 


02C7 


EDA8 


LDD 


* 


0338 


CB8D 


RES 


I7L 


02C9 


EDB8 


LDDR 


ft 


033A 


CB96 


RES 


2?(HL) 


02CB 


EDAO 


LDI 


ft 


033C 


DDCBdd96 


RES 


2?(IX+dd) 


02CD 


EDBO 


LDIR 


ft 


0340 


FDCBdd96 


RES 


2*(IY+dd) 


D2CF 


ED44 


NEG 


ft 


0344 


CB97 


RES 


2?A 


02D1 


00 


NOP 


* 


0346 


CB90 


RES 


2 ? B 


02D2 


B6 


OR (HL) 


ft 


0348 


CB91 


RES 


2 ? C. 


02D3 


DDB6dd 


OR (IX+dd) 


ft 


034A 


CB92 


RES 


27D 


02D6 


FDB6dd 


OR (IY+dd) 


* 


034C 


CB93 


RES 


2?E 


02D9 


B7 


OR A 


* 


034E 


CB94 


RES 


2 ? H 


02DA 


BO 


OR B 


* 


0.350 


CB95 


RES 


2?L 


02DB 


Bl 


OR C 


* 


0352 


CB9E 


RES 


3?(HL) 


02DC 


B2 


OR D 


* 


0354 


DDCBdd9E 


RES 


3;(IX+dd) 


02DD 


B3 


OR E 


ft 


0358 


FDCBdd9E 


RES 


3;(IY+dd) 


02DE 


B4 


OR H 


* 


035C 


CB9F 


RES 


37A 


02DF 


B5 


OR L 


ft 


035E 


CB98 


RES 


3>B 


02EO 


F6nn 


OR N 


* 


0360 


CB99 


RES 


3>C 


02E2 


EDBB 


OTDR 


ft 


0362 


CB9A 


RES 


3;D 


02E4 


EDB3 


OTIR 


ft 


0364 


CB9B 


RES 


3;E 


02E6 


ED79 


OUT (OiA 


II 


0366 


CB9C 


RES 


3;H 


02E8 


ED41 


OUT (C)?B 


* 


0368 


CB9D 


RES 


3?L 


02EA 


ED49 


OUT (C)»C 


* 


036A 


CBA6 


RES 


4><HL) 


02EC 


ED51 


OUT (C)jD 


ft 


036C 


DDCBddA6 


RES 


47 (IX+dd) 


02EE 


ED59 


OUT (C.);E 


* 


0370 


FDCBddA6 


RES 


4? ( IY+dd) 


02F0 


ED61 


OUT (C)iH 


* 


0374 


CBA7 


RES 


4;A 


02F2 


ED69 


OUT (C)iL 


* 


0376 


CBAO 


RES 


4>B 


D2F4 


D3nn 


OUT (N)*A 


* 


0378 


CBA1 


RES 


47C 


02F6 


EDAB 


OUTD 


* 


037A 


CBA2 


RES 


4;D 


02F8 


EDA3 


OUTI 


* 


037C 


CBA3 


RES 


4?E 


02FA 


Fl 


POP AF 


ft 


037E 


CBA4 


RES 


4>H 


02FB 


CI 


POP BC 


* 


0380 


CBA5 


RES 


4;L 


02FC 


Dl 


POP DE 


* 


0382 


CBAE 


RES 


5; (HL) 


02FD 


El 


POP HL 


* 


0384 


DDCBddAE 


RES 


5? (IX+dd) 


02FE 


DDE1 


POP IX 


ft 


0388 


FDCBddAE 


RES 


57(IY+dd) 


0300 


FDE1 


POP IY 


ft 


038C 


CBAF 


RES 


5;A 


0302 


F5 


PUSH AF 


ft 


038E 


CBA8 


RES 


5 ? B 


0303 


C5 


PUSH BC 


ft 


0390 


CBA9 


RES 


5>C 



280 I GRAPHISMES EN ASSEMBLEUR SUP AMSTRAD 



0304 


D5 


PUSI- 


DE 


* 


0392 


CBAA 


RES 


5?D 


0305 


E5 


PUSh 


HL 


* 


0394 


CBAB 


RES 


57E 


0306 


DDES 


PUSH 


IX 


tf 


0396 


CBAC 


RES 


57H 


030S 


FDE5 


PUSH 


IY 


* 


0398 


CBAD 


RES 


5?L 


030A 


CB86 


RES 


07<HL> 


* 


039A 


CBB6 


RES 


6;(HL) 


030C 


DDCBdd86 


RES 


0? (IX+dd) 


K 


039C 


DDCBddB6 


RES 


6? (IX+dd) 


0310 


FDCBdd86 


RES 


0/ (IY+dd) 


* 


03A0 


FDCBddB6 


RES 


67 (IY+dd) 


0314 


CB87 


RES 


0?A 


* 


03A4 


CBB7 


RES 


67A 


0316 


CB80 


RES 


0;B 


ft 


03A6 


CBBO 


RES 


67B 


0318 


CB81 


RES 


0?C 


t 


03AS 


CBB1 


RES 


67C 


D31A 


CB82 


RES 


O7D 


* 


03AA 


CBB2 


RES 


67D 


031C 


CB83 


RES 


O7E 


If 


03AC 


CBB3 


RES 


67E 


031E 


CB84 


RES 


O7H 


* 


03AE 


CBB4 


RES 


67H 


0320 


CB85 


RES 


0;L 


* 


D3B0 


CBB5 


RES 


6;L 


0322 


CB8E 


RES 


17<HL) 


* 


D3B2 


CBBE 


RES 


77<HL) 


0324 


DDCBddSE 


RES 


1; (IX+dd) 


* 


03B4 


DDCBddBE 


RES 


7 ? (IX+dd) 


0328 


FDCBddSE 


RES 


lMIY+dd) 


# 


03B8 


FDCBddBE 


RES 


7 ? (IY+dd) 


032C 


CB8F 


RES 


1>A 


* 


03BC 


CBBF 


RES 


7 ? A 


032E 


CB38 


RES 


I7B 


* 


03BE 


CBB8 


RES 


77B 


0330 


CB89 


RES 


1 7 C 


* 


03C0 


CBB9 


RES 


7 ? C 


0332 


CB8A 


RES 


I7D 


tf 


03C2 


CBBA 


RES 


7 ? D 


03C4 


CBBB 


RES 


77E 


ft 


043F 


C7 


RST 


00 


03C6 


CBBC 


RES 


77H 


* 


0440 


CF 


RST 


08 


03C8 


CBBD 


RES 


7/L 


* 


0441 


D7 


RST 


10H 


03CA 


C9 


RET 




■:■;- 


0442 


DF 


RST 


1SH 


03CB 


D8 


RET 


C 


'.<■ 


0443 


E7 


RST 


20H 


03CC 


F8 


RET 


M 


K 


0444 


EF 


RST 


2SH 


03CD 


DO 


RET 


NC 


* 


0445 


F7 


RST 


30H 


03CE 


CO 


RET 


NZ 


tt 


0446 


FF 


RST 


38H 


03CF 


FO 


RET 


P 


* 


0447 


9E 


SBC 


A 7 (HL) 


03D0 


E8 


RET 


PE 


if 


0448 


DD9Edd 


SBC 


A? (IX+dd) 


03D1 


EO 


RET 


PO 


ft 


044B 


FD9Edd 


SBC 


A7(IY+dd) 


03D2 


C8 


RET 


Z 


* 


044E 


9F 


SBC 


A?A 


03D3 


ED4D 


RET! 




* 


044F 


98 


SBC 


A7B 


03D5 


ED45 


RETN 


If 


0450 


99 


SBC 


A;C 


03D7 


CB16 


RL 


HL) 


ft 


0451 


9A 


SBC 


A7D 


03D9 


DDCBddl6 


RL 


IX+dd) 


* 


0452 


9B 


SBC 


A7E 


03DD 


FDCBddl6 


RL 


IY+dd) 


ft 


0453 


9C 


SBC 


A7H 


03E1 


CB17 


RL A 


* 


0454 


9D 


SBC 


A?L 


03E3 


CB10 


RL B 


# 


0455 


DEnn 


SBC 


A7N 


03E5 


CB11 


RL ( 


* 


K 


0457 


ED42 


SBC 


HL7BC 


03E7 


CB12 


RL D 


* 


0459 


ED52 


SBC 


HL7DE 


03E9 


CB13 


RL E 


* 


045B 


ED62 


SBC 


HL7HL 


D3EB 


CB14 


RL H 


» 


045D 


ED72 


SBC 


HL7SP 


03ED 


CB15 


RL L 


* 


045F 


37 


SCF 




03EF 


17 


RLA 




ft 


0460 


CBC6 


SET 


O7 (HL) 


D3FO 


CB06 


RLC 


(HL) 


X 


0462 


DDCBddC6 


SET 


O7 (IX+dd) 


D3F2 


DDCBdd06 


RLC 


(IX+dd) 


ft 


0466 


FDCBddC6 


SET 


0?(IY+dd) 


03F6 


FDCBdd06 


RLC 


(IY+dd) 


ft 


046A 


CBC7 


SET 


O7A 


03FA 


CB07 


RLC 


A 


* 


046C 


CBCO 


SET 


? B 


03FC 


CBOO 


RLC 


B 


* 


046E 


CBC1 


SET 


O7C 


03FE 


CB01 


RLC 


C 


* 


0470 


CBC2 


SET 


O7D 


0400 


CB02 


RLC 


D 


* 


0472 


CBC3 


SET 


O7E 


0402 


CB03 


RLC 


E 


ft 


0474 


CBC4 


SET 


0;H 


0404 


CB04 


RLC 


H 


X 


0476 


CBC5 


SET 


0?L 


0406 


CB05 


RLC 


L 


* 


0478 


CBCE 


SET 


1? (HL) 


0408 


07 


RLCA 


* 


047A 


DDCBddCE 


SET 


ir< IX+dd) 


0409 


ED6F 


RLD 




-X 


047E 


FDCBddCE 


SET 


I7 (IY+dd) 


040B 


CB1E 


RR 


HL) 


# 


0482 


CBCF 


SET 


1?A 



040D 

0411 

D415 

0417 

0419 

041B 

041D 

041F 

0421 

0423 

0424 

0426 

042A 

042E 

0430 

0432 

0434 

0436 

0438 

043A 

043C 

043D 

04B8 

04BA 

04BC 

04BE 

04CO 

04C2 

04C6 

04CA 

04CC 

04CE 

04D0 

04D2 

04D4 

04D6 

04D8 

04DA 

04DE 

04E2 

04E4 

04E6 

04E8 

04EA 

04EC 

04EE 

04FO 

04F2 

04F6 

04FA 

04FC 

04FE 

0500 

0502 

0504 

0506 

D50S 

050A 

050E 















ANNEXE 7 1 281 


DDCBddlE 


RR (IX+dd) 


* 


0484 


CBC8 


SET 


I7B 


FDCBddlE 


RR (IY+dd) 


# 


0486 


CBC9 


SET 


if-fi 


CB1F 


RR A 




# 


0488 


CBCA 


SET 


1?D 


CB18 


RR B 




* 


048A 


CBCB 


SET 


1 ? E 


CB19 


RR C 




* 


048C 


CBCC 


SET 


IkH 


CB1A 


RR E 




* 


048E 


CBCD 


SET 


JUL 


CD IB 


RR E 




* 


D490 


CBD6 


SET 


2><HL) 


CB1C 


RR h 




x 


0492 


DDCBddD6 


SET 


27(IX+dd) 


CB1D 


RR L 




* 


0496 


FDCBddD6 


SET 


2? (IY+dd) 


IF 


RRA 




* 


049A 


CBD7 


SET 


2*A 


CBOE 


RRC 


(HL) 


* 


049C 


CBDO 


SET 


27B 


DDCBddOE 


RRC 


(IX+dd) 


* 


049E 


CBD1 


SET 


2?C 


FDCBddOE 


RRC 


( IY+dd) 


# 


04A0 


CBD2 


SET 


2?D 


CBOF 


RRC 


A 


* 


04A2 


CBD3 


SET 


2 ? E 


CB08 


RRC 


B 


* 


04A4 


CBD4 


SET 


2>H 


CB09 


RRC 


C 


ft 


04A6 


CBD5 


SET 


2?L 


CBOA 


RRC 


D 


* 


04A8 


CBDE 


SET 


3 7 (HL) 


CBOB 


RRC 


E 


X 


04AA 


DDCBddDE 


SET 


3 ? (IX+dd) 


CBOC 


RRC 


H 


# 


04AE 


FDCBddDE 


SET 


3? (IY+dd) 


CBOD 


RRC 


L 


* 


04B2 


CBDF 


SET 


3 ? A 


OF 


RRC£ 




X 


Q4B4 


CBD8 


SET 


3 ? B 


ED67 


RRD 




* 


04B6 


CBD9 


SET 


3?C 


CBDA 


SET 


3/D 


* 


052C 


CB20 


SLA 


B 


CBDB 


SET 


3;E 


« 


052E 


CB21 


SLA 


C 


CBDC 


SET 


3;H 


R 


0530 


CB22 


SLA 


D 


CBDD 


SET 


3;L 


* 


0532 


CB23 


SLA 


E 


CBE6 


SET 


4* (HL) 


tf 


0534 


CB24 


SLA 


H 


DDCBddE6 


SET 


4;(IX+dd) 


* 


0536 


CB25 


SLA 


L 


FDCBddE6 


SET 


47<IY+dd) 


* 


0538 


CB2E 


SRA 


(HL) 


CBE7 


SET 


4;A 


X 


053A 


DDCBdd2E 


SRA 


(IX+dd) 


CBEO 


SET 


4>B 


* 


053E 


FDCBdd2E 


SRA 


(IY+dd) 


CBE1 


SET 


4;C 


* 


0542 


CB2F 


SRA 


A 


CBE2 


SET 


4?D 


X 


0544 


CB28 


SRA 


B 


CBE3 


SET 


4;E 


* 


0546 


CB29 


SRA 


C 


CBE4 


SET 


4 ? H 


X 


0548 


CB2A 


SRA 


D 


CBE5 


SET 


4;L 


It 


054A 


CB2B 


SRA 


E 


CBEE 


SET 


57(HL) 


X 


054C 


CB2C 


SRA 


H 


DDCBddEE 


SET 


5? (IX+dd) 


* 


054E 


CB2D 


SRA 


L 


FDCBddEE 


SET 


57 (IY+dd) 


* 


0550 


CB3E 


SRL 


(HL) 


CBEF 


SET 


5>A 


X 


0552 


DDCBdd3E 


SRL 


(IX+dd) 


CBE8 


SET 


57B 


* 


0556 


FDCBdd3E 


SRL 


(IY+dd) 


CBE9 


SET 


5 ? C 


X 


055A 


CB3F 


SRL 


A 


CBEA 


SET 


57D 


* 


055C 


CB38 


SRL 


B 


CBEB 


SET 


5/E 


* 


055E 


CB39 


SRL 


C 


CBEC 


SET 


5 ? H 


K 


0560 


CB3A 


SRL 


D 


CBED 


SET 


5;L 


* 


0562 


CB3B 


SRL 


E 


CBF6 


SET 


61 (HL) 


X 


0564 


CB3C 


SRL 


H 


DDCBddF6 


SET 


67<IX+dd> 


* 


0566 


CB3D 


SRL 


L 


FDCBddF6 


SET 


67 (IY+dd) 


* 


0568 


96 


SUB 


(HL) 


CBF7 


SET 


6 ? A 


X 


0569 


DD96dd 


SUB 


(IX+dd) 


CBFO 


SET 


67B 


* 


056C 


FD96dd 


SUB 


(IY+dd) 


CBF1 


SET 


67C 


X 


056F 


97 


SUB 


A 


CBF2 


SET 


67D 


* 


0570 


90 


SUB 


B 


CBF3 


SET 


67E 


* 


0571 


91 


SUB 


C 


CBF4 


SET 


67H 


x 


D572 


92 


SUB 


D 


CBF5 


SET 


67L 


# 


0573 


93 


SUB 


E 


CBFE 


SET 


7;(HL) 


X 


0574 


94 


SUB 


H 


DDCBddFE 


SET 


7»(IX+dd) 


* 


0575 


95 


SUB 


L 


FDCBddFE 


SET 


7;(IY+dd) 


* 


0576 


D6nn 


SUB 


N 



282 I QRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 



0512 CBFF 


SET 


7tA 




* 


057S 


AE 


XOR 


(HL) 


0514 CBF8 


SET 


7?B 




* 


0579 


DDAEdd 


XOR 


(IX+dd) 


0516 CBF9 


SET 


7>C 




* 


057C 


FDAEdd 


XOR 


(IY+dd) 


0518 CBFA 


SET 


7?D 




it 


057F 


AF 


XOR 


A 


051A CBFB 


SET 


7;E 




* 


D580 


A8 


XOR 


B 


051C CBFC 


SET 


7;H 




* 


0581 


A9 


XOR 


C 


051E CBFD 


SET 


7?L 




* 


0582 


AA 


XOR 





0520 CB26 


SLA 


(HL) 




* 


0583 


AB 


XOR 


E 


0522 DDCBdd26 


SLA 


(IX + 


dd) 


tt 


0584 


AC 


XOR 


H 


0526 FDCBdd26 


SLA 


(IY+ 


dd) 


* 


D585 


AD 


XOR 


L 


052A CB27 


SLA 


A 




* 


0586 


EEnn 


XOR 


N 






Annexe 8 



Lexique et index 



□ Adressage : 

acces a une information. II existe des modes d'adressage : ceux-ci 
correspondent a la fagon dont on y accede. Par exemple, on parle 
d'adressage indirect lorsqu'au lieu d'utiliser explicitement une donnee, 
on passe par un intermediaire la contenant. Cet intermediaire peut etre 
soit une case memoire soit un registre. 

□ Adresse : 

nombre de 16 bits (sur le Z-80), ou plus, permettant de reperer une case 
memoire. Chaque case memoire est en effet numerotee. La premiere est 
0, la derniere sur le Z-80 est 65535. Sur un microprocesseur 8 bits, une 
adresse est codee sur 16 bits de fagon a acceder a 64 Ko. Sur I'Amstrad, 
il existe parfois des adresses de 24 bits, indiquant les ROM ou RAM 
paralleles disponibles (par ce moyen, le Z-80 peut acceder a plus de 
64 Ko de memoire, ce qui n'est theoriquement pas possible). Des 
circuits specialises connectent les RAM ou ROM visees, et Ton peut 
ensuite acceder, dans les 64 Ko ainsi "visibles" du Z-80, a n'importe 
laquelle des 65536 cases. 

Par abus de langage, on appelle egalement adresse n'importe quel 
nombre de 16 bits, meme s'il n'est pas destine & representer une case 
memoire. On peut dans ce cas parler de mot afin d'eviter les confusions. 



284 i GRAPHISMES EN ASSEMBLEUR SUR AMSTRAO 

D Appel : 

en langage machine, un appel provoque I'execution d'une routine. 
L'appel en Z-80 se nomme CALL, en Basic GOSUB (ou CALL egalement 
pour un appel de routine en langage machine). Une fois I'execution de la 
routine achevee, celle du programme appelant se poursuit a I'endroit 
suivant le CALL. 

□ Attribution de registres : 

etape de la programmation "Top-Down" en langage machine. Cela 
consiste a attribuer aux differents registres disponibles un role particu- 
lier lors des calculs. Cette etape evite les erreurs d'etourderie. 

D Binaire : 

mode de calcul en base 2. Les deux chiffres sont et 1. Le binaire 
constitue le langage de comprehension du processeur : la plupart des 
operations travaillent en binaire. 

□ Bit: 

unite de stockage elementaire. Un bit permet de stocker un seul chiffre 
binaire ; il possede done la valeur ou 1. Le Z-80, ainsi que la majorite 
des micro-ordinateurs, travaillent avec des groupements de huit bits, 
appeles octets. Le Z-80 possede egalement le necessaire pour travailler 
avec des valeurs de 16 bits. Un bit permet de memoriser un nombre 
compris entre et 1, huit bits permettent de stocker entre 00000000 et 
11111111 exprimes en binaire, soit a 255 en decimal. Seize bits 
permettent de stocker les valeurs a 65535. En anglais, bit signifie 
"Binary Digit", soit chiffre binaire. 

u Boucle : 

structure de programmation. Consiste a repeter une meme routine, 
tache ou instruction un certain nornbre de fois. Ce nombre de repeti- 
tions peut dependre du principe utilise pour stopper la boucle. On peut 
boucler six fois, on peut egalement boucler jusqu'a ce qu'une certaine 
condition soit remplie. Pour mettre en place une boucle en langage 
machine, on utilise en Z-80 I'instruction DJNZ ou des tests suivis de 
sauts conditionnels. 

□ Buffer: 

zone memoire reservee au stockage intermediaire de donnees avant un 
traitement. On determine la tailie d'un buffer par ie besoin maximal 
prevu. Ainsi si I'on prevoit d'avoir de 10 & 120 octets a memoriser, il 
faudra reserver 120 octets pour un buffer. Et cela m§me si dans 99 % des 
cas on ne depassera pas 50 octets. 

□ Carry : 

flag particulier present sur tout processeur. II s'agit d'un bit du registre 

d'etat (registre F sur le Z-80) qui indique les depassements de capacite. 
Le Carry est positionne par exemple lorsque I'addition d'un nombre au 
registre A conduit a un nombre de plus de huit bits. Ce nombre ne peut 
pas etre stocke dans A (qui ne possede que huit bits), et le "1" depassant 
est envoye dans le Carry. 



ANNEXE 8 I 285 



□ Compactage : 

procedure visant a reduire I'encombrement d'une table de donnees. On 
peut par exemple recourir a un compactage lorsqu'on stocke cent 
nombres dont les valeurs s'echelonnent entre et 15 : au lieu d'utiliser 
cent octets pour stocker ces nombres, on peut en utiliser cinquante en 
stockant deux nombres par octet. 

□ Decalage : 

operation binaire consistant a deplacer les chiffres binaires d'un nombre 
vers la gauche ou la droite, en ajoutant un autre chiffre a I'espace ainsi 
cree. On utilise generalement les decalages dans les operations 
arithmetiques. Un decalage a gauche multiplie par 2, un decalage a 
droite divise par deux. 



D 



Decrementation : soustraction d'une unite (voir incrementation). 



□ Entrelacement : 

organisation particuliere du contenu de la RAM-Ecran, permettant de 
simplifier la generation du signal video par le controleur. Les bits 
correspondant aux points ne sont pas regroupes sequentiellement. 

□ Flag : 

information binaire (0 ou 1) refletant le resultat d'une operation. Le Z-80 
possede six flags, regroupes dans le registre F (deux bits y sont 
inutilises). Ces flags sont "positionnes" (mis a 1) ou non (mis a 0) 
suivant les travaux anterieurs. Par exemple, "CP n" provoque le 
positionnement du flag C (voir "Carry") si le contenu du registre A est 
strictement inferieur au nombre n, et sa mise a zero dans le cas 
contraire. 

□ Fond (couleur) : 

le fond de I'ecran est generalement represents par le stylo 0. La couleur 
peut etre quelconque. On convient done d'utiliser une, trois ou quinze 
couleurs suivant le mode de resolution choisi, plus une pour le fond. II 
vaut mieux dissocier le fond et ne pas le considerer comme une couleur, 
mais plutot comme I'absence de couleur. Lestraitements graphiques de 
transparence en sont facilites. 

□ Graphe hierarchique : 

schema resumant ('organisation des routines d'un programme. Ce 
graphe permet de programmer modulairement. II est generalement 
utilise avec les langages structures comme Pascal, mais rien ne 
s'oppose a la programmation structuree en langage machine : la 
structuration concerne ['organisation du programme et non sa program- 
mation proprement dite. 

D Hexadecimal : 

mode de numeration en base 16. Ls chiffres de cette base vont de a 9, 
suivis de A a F (qui represented 10 a 15, exprimes en decimal). La base 
16 est tres utilisee en langage machine pour son aspect pratique. En 
effet un octet se represente par deux chiffres (valeurs 00 a FF), une 



286 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 

adresse par quatre chiffres. Un chiffre hexadecimal (0 a F) represente 
quatre bits, soit les valeursOOOO a 1111. C'estexactementun demi-octet. 

□ Incrementation : 

addition d'une unite. On utilise souvent cette operation pour progresser 
facilement dans les tables de donnees. Si le registre HL pointe sur les 
donnees, il suffit d'utiliser INC HL pour progresser, sans perdre le 
contenu de A. 

□ indexation : 

adressage particulier. Du strict point de vue de la definition, le Z-80 ne 
possede pas de vraie indexation. Mais il dispose de deux registres 
16 bits IX et IY qui permettent un semi-adressage indexe. Si IX contient 
I'adresse d'une table de donnees, on pourra incrementer le quatrieme 
octet par une instruction INC (IX+3). 

D Interface utilisateur : 

ensemble des routines chargees de prendre en compte les actions de 
I'utilisateur (clavier, joystick, souris...) et de les fournir au programme 
dans un format pratique. On peut egalement considerer que les routines 
chargees de fournir les resultats a I'utilisateur en font partie. 

D Interruption : 

evenement externe au programme provoquant la suspension de son 
deroulement, I'execution d'une routine de traitement de I'interruption, 
puis la reprise du programme. II existe les interruptions materieiles et 
les logicielles. Les interruptions materieiles sont invisibles, elles ne 
concernent que le systeme. En revanche, on peut mettre en place des 
interruptions logicielles de fagon a traiter des evenements reguliers 
independants du programme. C'est par exemple le cas lorsqu'on fait 
clignoter un stylo avec deux couleurs : le stylo n'a en fait qu'une seule 
couleur. Mais une interruption logicielle est mise en place pour modifier 
celle-ci regulierement. 

D Kilo-octet : 

unite de mesure de capacite memoire. Un kilo represente 1 024 octets. 
C'est bien de 1 024 qu'il s'agit et non 1 000. A I'origine de cette etrange 
unite de mesure se trouve un aspect pratique. En effet, 1 024 se 
represente par 400 en hexadecimal. C'est un nombre pratique pour les 
calculs, puisque la plupart du temps les calculs ont lieu en base 16. 
L'idee originale etait de prendre le nombre hexadecimal le plus proche 
de 1 000 (Kilo) et le plus pratique. Ce fut 400, soit 1 024 ! le "K" 
s'applique egalement aux bits. Ainsi, les circuits integres memoire 
donnent-ils acces a des bits, generalement exprim6s en Kbits 
(1024 bits). Les 4 116 sont des circuits 16 Kbits (il en faut huit en 
parallele pour obtenir 16 Kilo-octets), les 4 164 possedent 64 Kbits (huit 
circuits 4 164 constituent la memoire de I'Amstrad CPC 464), et les plus 
recents, les 256 Kbits, se nomment 4 256 (voir aussi Mega-octets). 

□ Lutin : voir objet graphique. 



ANNEXE 8 I 287 



□ Mega-octet : . . 

unite de mesure de capacite memoire. Cette unite, pnncipalement 
utilisee sur les ordinateurs a processeur 32 bits (mini-ordinateurs) ou 
sur certains micro-ordinateurs 16 bits, represente 1 024 Kilo-octets, soit 
tres exactement 1 048 576 octets. En hexadecimal, cela devient 100 000 
octets. Encore une fois (cf. Kilo-octets), I'aspect pratique de programma- 
tion a prevalu. On obtient un Mega de memoire vive en juxtaposant 
seize Amstrad CPC 464 ou 664 ! Sur les ordinateurs vraiment gros, on 
parle en Giga-octets, soit 1 024 Mega I 

□ Memoire morte : 

on appelle ainsi un circuit memoire non modifiable. Son contenu est fixe 
par le fabricant, sur la demande d'un constructed de materiel. II est 
inamovible. La memoire morte est indispensable au moins lors de la 
mise sous tension : le processeur doit avoir un programme, et il va 
chercher celui-ci dans le premier bout de memoire qu'il connait. 
L'Amstrad possede deux blocs de memoire morte de 16 Ko chacun. L'un 
contient I'interpreteur Basic, le second le systeme Sexploitation. Ces 
deux blocs occupent les memes adresses que deux blocs de 16 K de 
memoire vive. II va de soi que chaque bloc d'adresses n'est connecte 
qu'a un seul des blocs memoire a la fois. II est possible de connecter ou 
deconnecter, en langage machine, chacun de ces blocs. 

□ Memoire vive ; 

au contraire de la morte, cette memoire est modifiable. Elle regoit les 
informations du systeme, les programmes, ou les donnees. On peut 
reellement en faire n'importe quoi. Toutefois, une zone de la memoire 
vive est reservee a I'ecran, et quelques autres zones sont utiiisees par le 
systeme dans sa gestion interne. 

□ Mips : 

unite de mesure de rapidite de calcul. Mips signifie Million d instruc- 
tions par seconde. Sur un micro-ordinateur 8 bits, on parle peu de cette 
unite de mesure, car il s'agit plus de milliers destructions par seconde. 
On se base plus sur le processeur utilise et la frequence de son horloge 
pour estimer sa rapidite. Un processeur Z-80 a 4 MHz represente une 
tres bonne performance a ce niveau. Mais beaucoup d'autres elements 
sont a prendre en compte (optimisation du logiciel interne, organisation 
materielle du systeme, capacite graphiques, etc) pour une bonne 
evaluation. 

□ Mode graphique : voir resolution. 

□ Mode transparent : 

ce mode graphique de travail n'existe pas au niveau materiel. Mais il est 
facilement simulable par logiciel. II consiste a ne pas utiliser la couleur 
de fond, et a agir comme si celle-ci etait transparente. En d'autres 
termes, un point trace avec le stylo (par convention, le stylo est 
associe au fond) est considere comme inexistant : on ne le trace pas. 
l/avantage de ce procede est de permettre un dessin de personnage sur 



288 I GRAPHEMES EN ASSEMBLEUR SUR AMSTRAD 

un decor sans effacer celui-ci. II existe d'autres variantes du mode 
transparent : le mode XOR est le plus pratique, mais n'est pas toujours 
beau. 

D Objet graphique : 

dessin elementaire (personnage, partie de decor...) manipulable. Sur 
Amstrad, les objets graphiques doivent 6tre g6r6s par programme. On 
les inscrit generalement dans un rectangle, de fagon a accelerer leur 
traitement. Certaines machines possedent des circuits capables de gerer 
de tels objets (Texas 99/4A, Commodore 64, MSX ...). L'avantage 
essentiei est de faciliter les traitements, mais on y perd parfois en 
souplesse. Sur I'Amstrad, il faut programmer la gestion complete des 
objets graphiques, ce qui autorise une definition "sur mesure". 

□ Octet: 

huit bits. L'octet est la plus petite unite memoire accessible a un 
processeur 8 bits. Le Z-80 possede toutefois certaines instructions de 
travail sur les bits. Mais le plus souvent, un programme travaille a partir 
d'octets. Un octet permet de memoriser les nombres a 255 (00 a FF en 
hexadecimal). Chaque octet de la memoire utilisable est caracterise par 
son numero, appele adresse. 

□ Pointeur : 

variable ou registre contenant I'adresse d'une information (voir indexa- 
tion, adressage, incrementation). 

□ Port d'entree/sortie : 

element du processeur destine a la communication avec les circuits 
secondaires et peripheriques. Ainsi, le controleur video et le gate-array 
sont programmables grace aux ports d'E/S qui leur sont attribues. II en 
va de meme avec la majorite des autres circuits du processeur. Le Z-80 
possede des instructions pour envoyer des donnees sur les ports ou en 
recevoir. 

□ RAM: 

signifie "memoire a acces quelconque" en anglais. En frangais, on parle 
de memoire vive (on peut lire ou 6crire des informations) ou de MEV. II 
existe d'autres versions : CRAM, notamment, qui indique une memoire 
vive constante. Ces CRAM gardent leurs informations lorsque lecourant 
est coupe (voir aussi memoire vive). 

D RAM-Ecran : 

partie de la memoire vive ou est memorise I'ecran. Cette RAM n'est 
guere utilisable pour y stocker un programme, encore que cela soit 
imaginable sur I'Amstrad, car 384 octets de cette RAM ne sont pas pris 
en compte. 

D Registre : 

element de memoire du processeur. On peut assimiler les registres a 
des cases memoires, a ceci pres qu'ils sont integres au processeur. lis 
ont pour but de memoriser les arguments des instructions Z-80. Ainsi, 



ANNEXE 8 I 289 

I'instruction "LD A, (HL)" permet de ranger dans le registreA la donnee 
se situant a la case memoire dont I'adresse est contenue dans HL HL et 
A permettent dans ce cas precis de r6cuperer, dans le processeur, une 
information situee en RAM exteme. 

D Resolution : 

capacity de I'ecran, en terme d'informations. L'Amstrad possede trois 
resolutions au choix de I'utilisateur, suivant le nombre de points 
graphiques, de caracteres ou de couleurs qu'il desire. 

□ Rotation : 

operation binaire consistant a decaler un octet a gauche ou £ droite d'un 
bit en recuperant le bit ejecte de ['autre cote. 

D Saul: 

operation consistant a sauter d'un endroit du programme a un autre. 
Sur le Z-80, ('instruction de saut se nomme JP. II existe aussi JR, un peu 
different par son encombrement memoire, sa rapidite et son fonctionne- 
ment. Les sauts peuvent etre conditionnels. Cela signifie qu'un test leur 
est associe, concernant un des flags du Z-80. Si le test conduit a un 
resuitat vrai, le saut est effectue, sinon il est ignore. 

□ Signe (nombre) : 

les operations arithmetiques du langage machine necessitent parfois 
('existence de nombres negatifs. Or, ceux-ci ne peuvent pas etre codes 
en binaire : un bit peut memoriser un chiffre ou 1, mais pas un signe 
"-". II existe done une convention sur laquelle I'information se base : 
celle des nombres signes. Elle indique une facon de considerer un 
nombre binaire positif. Pour une donnee "n" bits (n est 8 ou 16 en Z-80), 
"n-1" bits contiennent la valeur du nombre, le dernier bit etant utilise 
comme signe. En I'occurrence, e'est toujours le bit le plus a gauche du 
nombre qui est pris comme signe si le nombre doit etre considere 
comme signe. Un bit a 1 indique un nombre negatif (voir I'annexe 1). 

D Sprite : voir lutin, objet graphique. 

□ Stylo : 

element imaginaire associe a une couleur. Chaque point de I'ecran est 
associe, dans la RAM-Ecran, a une valeur numerique. Cette valeur 
numerique est le numero de stylo. Selon la resolution, i'Amstrad 
possede 2, 4 ou 16 stylos, autorisant done 2, 4 ou 16 couleurs differentes 
sur I'ecran. Le stylo est generalement considere comme celui du fond. 
Le stylo n'a aucun rapport avec sa couleur : rien n'empeche de 
programmer la meme couleur pour deux stylos differents. 

D Systeme d'exploitation : 

ensemble des routines systemes. Ces routines donnent acces aux 
fonctionnalites de la machine (a savoir les points graphiques, les ROM 
complementaires, les peripheriques, etc). Le systeme d'exploitation de 
I'Amstrad remplit 16 K de ROM, et est accessible grace aux blocs de 
vecteurs, ou bien par appel utilisant une adresse de 24 bits. Bien que le 



290 I GRAPHEMES EN ASSEMBLEUR SUR AMSTRAD 

systeme soit independant du Basic (ce qui n'est pas le cas sur 99 % des 
micro-ordinateurs), certaines fonctionnalites du Basic sont aussi inte- 
grees dans les blocs de vecteurs, en particulier les routines de calcul en 
nombres reels. Mais le systeme d'exploitation lui-meme ne les utilise 
pas. 

D Top-down : 

methode de travail. Consiste a definir le programme en raffinant ses 
taches par etapes. On parle aussi de niveau : au niveau 0, ('analyse 
comporte les donnees a fournir, le travail effectue, et ce qui doit en 
sortir. Puis on prend chacun de ces elements et on les raffine un peu, et 
ainsi de suite, jusqu'a obtenir un ensemble de taches independantes, 
qu'on nomme modules. On peut alors definir les variables et structures 
de donn6es n^cessaires, et enfin programmer les modules dans I'ordre 
inverse (du plus bas vers le plus haut). Par cette methode, on ne passe a 
un niveau plus haut que lorsque les routines d'un niveau sont toutes au 
point. La methode TOP-DOWN vient en partie des romanciers (!) et des 
travaux de Kathleen Jensen et Niklaus Wirth, inventeurs du langage 
Pascal et de la programmation structuree. Elle est adoptee de fagon 
quasi unanime en informatique & la place des organigrammes depuis 
cinq ou six ans. Le principe de base de ce type de travail est le suivant : 
des qu'apparait une tache donnee pour laquelle on aimerait disposer 
d'une instruction jouant le merne role, on remplace I'enonce de cette 
t§che par I'appel d'un module, lequel est analyse par ailleurs. 
L'un des principes les plus importants est "analyse du haut vers le bas, 
programmation du bas vers le haut". 

a Variable 8/16 bits : 

emplacement fixe de la memoire ou Ton place une donnee de travail. On 
peut avoir une variable 8 bits pour stocker un octet (il suffit alors de 
reserver une adresse memoire a cet effet) ou 16 bits pour stocker une 
adresse, un pointeur ou un simple nombre 16 bits (il faut dans ce cas 
reserver deux adresses, si possible successives). 

□ Vecteur : 

instruction de saut placee a une adresse fixee et connue. Les routines 
systdmes situees en ROM sont toutes accessibles grace & un bloc de 
vecteurs places en RAM lors de la mise sous tension de I'Amstrad. 
L'emplacement de ces vecteurs ne change pas quel que soit le modele. 
L'appel d'une routine systeme du 464 par le biais de son vecteur aura 
done exactement le meme effet sur le 6128, meme si la routine ne se 
situe absolument pas au meme endroit en ROM. Une illustration 
souvent utilisee pour expliquer ce fonctionnement est la parabole 
d'Alfred, Barnabe et Christian. Alfred cherche Christian, qui peut etre en 
trois endroits differents. Or, Barnabe sait TOUJOURS ou se trouve 
Christian. II est done evident que Alfred va trouver Christian en passant 
par Barnabe. Dans I'Amstrad, Alfred devient le programme, Barnabe le 
vecteur et Christian la routine systeme. 



ANNEXE 8 I 291 



CALL basic 


50 


CALLZ-80 


48 


CRTC 6845 


12 


DRAW 


25 


EQU 


148 


GATE-ARRAY 


12 


LD 


41 


MEMORY 


49 


MOVE 


25 


PLOT 


25-68 


POP 


45 


PUSH 


45 


TESTE 


27 


assembleur 


32 


avantplan 


199 


bits 


18-180-A7 


carry 


47 


cercle 


60 


collision d'objets 


208 


complementation 


68-103 


compactage 


166 


coordonnees (systeme de...) 


24-208 


division 


87 


drapeau 


cfflag. 


entrelacement 


18 


flags 


37-47 


fond 


195 


histogramme 


79 


joystick 


180 


masque 


A3 


memoire ecran 


13-A6 


modeXOR 


191 


multiplication 


63-88 


nombreflottant 


62 


nombresigne 


A7 


objetgraphique 


128 


pile 


39 


point physique 


24 


point logique 


24 


registre 


37 


regA 


37 


regB 


38 


regC 


38 


regD 


38 


regE 


38 


regF 


37 


reg H 


38 


regL 


38 


reg I 


38 


regR 


38 



292 I GRAPHEMES EN ASSEMBLEUR SUR AMSTRAD 



regPC 


38 


regSP 


38 


reglX 


38 


reglY 


38 


remplissage de zone 


105 


resolution 


17 


stylo 


22 


systeme d'exploitation 


23-58-AZ 


territoire interdit 


208 


transparence 


195 


vecteur 


58 


zero (drapeau) 


48 



Annexe 9 
La disquette d'accompagnement 



Vous pouvez utiliser le bon de commande ci-joint (ou une photocopie) 
afin de vous procurer la disquette correspondant au livre. Cette disquette 
vous evitera les penibles taches de saisie des programmes. En void le 
contenu detaille par face. 

□ FACE A: 1) Les 18 programmes Basic des chapitres 1 a 3 sont 
contenus tels quels sur cette face de la disquette. 

2) La premiere face contient egalement les fichiers sources 
des 20 programmes en assembleur des chapitres 1 a 8. 
Ces fichiers sont au format ASCII et peuvent done etre 
utilises par un assembleur quelconque. 

3) Un utilitaire de listage des programmes sources assem- 
bleur est egalement fourni, vous permettant de lister sur 
ecran ou imprimante les fichiers voulus. 

4) Une routine supplemental et son programme Basic de 
mise en oeuvre (ainsi que le fichier source de la routine) 
sont egalement proposes. Cette routine, non pr6sente 
dans le livre, permet le defilement souple d'un message 
de 26caracteres sur I'gcran. La vitesse de defilement est 
reglable. Un message exemple est fourni dans un fichier. 

5) Un programme menu permet de choisir parmi ies pro- 
grammes de cette face I'application d6sir6e, sans avoir a 
se souvenir du nom de fichier correspondant. II suffit de 
demander RUN" ". 



294 I GRAPHISMES EN ASSEMBLEUR SUR AMSTRAD 

D FACE B: 1) Les programmes DESSIN, IMAGECR, IMAGOBJ sont li- 
vres sur cette face, lis correspondent aux trois utilitaires 
du chapitre 9. Le programme assembleur du programme 
de dessin est egalement present ainsi que son source, 
toujours au format ASCII. 

2) Les 11 programmes d'application des chapitres4 a 8 sont 
proposes sous une nouvelle forme. II y est tenu compte de 
la structure de fichiers definie au chapitre 9. II est done 
possible d'utiliser chacun de ces programmes avec des 
objets et decors quelconques. II suffit pour cela de definir 
les fichiers objet et decor utilises avec le programme 
SETSYS. 

3) Le programme listeur de sources assembleur est egale- 
ment present sur cette face. 

4) Un grand nombre de fichiers images sont presents sur la 
face B : 

- 3 fichiers sont destines au programme dessin. lis 
contiennent quelques objets, et ('image utilisee dans le 
livre (chapitres4 a 8) assortie avec des couleurs pour 
les deux types de moniteurs. 

- 3 fichiers objets crees par DESSIN sont destines au 
programme IMAGOBJ. lis reprennent trois phases d'a- 
nimation d'une puce. 

- 1 fichier resume ces trois phases sous le nom PUCE. 

- 1 fichier PARAM.SYS contenant le nom de I'objet et du 
decor utilise (remise £ jour par le programme SETSYS). 

5) Le fichier SYSTEM.BIN contient les 12 routines LM des 
chapitres 4 a 8, routines permettant la gestion des objets. 

6) Enfin, un programme menu permet Texecution de tout 
programme situe sur cette face (RUN" "). 

Sur chaque face de la disquette se trouve egalement un programme 
explicatif fournissant des renseignements compldmentaires. Pour obtenir 
ses indications, il suffit de demander RUN"EXPUQUE". 



Conseils de lecture 



Pour approfondir vos connaissances en BASIC, mieux connaTtre le systeme 
des CPC 464, 664 et 6128, et maitriser le graphisme sur Amstrad, P.S.I, vous 
propose une palette d'ouvrages utiles. 

Pour maitriser le BASIC Amstrad : 

D BASIC Amstrad 1 - methodes pratiques - Jacques Boisgontier et Bruno 
Cesard (Editions du P.S.I.) 

Pour ceux qui ont d6j£ pratique un BASIC, voici un ouvrage de 
perfectionnement au BASIC Amstrad. Un chapitre sur le CP/M 2.2 et le 
CP/M Plus donne les principales commandes systemes. 

D BASIC Amstrad 2 - Programmes et fichiers - Jacques Boisgontier 
(Editions du P.S.I.). 

Pour pratiquer le BASIC Amstrad, cet ouvrage donne de nornbreux 
programmes de gestion, d'education et de jeux ou le role des fichiers est 
explique et largement commente. 

D BASIC plus - 80 routines sur Amstrad - Michel Martin (Editions du 
P.S.I. ). 

Pour pousser votre Amstrad au maximum de ses capacites : 80 routines 
de simulation d'instructions qui n'existent pas en BASIC Amstrad. 

Pour mieux connaitre le systeme des CPC : 

D Clefs pour Amstrad 1 - systeme de base - Daniel Martin (Editions du 
P.S.I.). 

Memento presentant synthetiquement le jeu d'instructions du Z-80, les 
points d'entree des routines systeme, les connecteurs et brochages, etc. 
Le livre de chevet du programmeur sur Amstrad. 






298 i GRAPHEMES EN ASSEMBLEUR SUR AMSTRAD 

D Clefs pour Amstrad 2 - systeme disque - Daniel Martin et Philippe 
Jadoul (Editions du P.S.I.). 

Ce deuxieme tome consacre au systeme disque presente les points 
d'entr^e des routines disque, les blocs de controle, la programmation et 
les brochages des circuits specialises... La deuxteme partie du livre est 
aussi destinee aux possesseurs d'Amstrad 8256. 

D CP/M plus sur Amstrad - Yvon Dargery (Editions du P.S.I.). Toutes les 
commandes CP/M et CP/M plus pour maltriser le systeme des 6128 et 
8256 : un ouvrage de reference illustre par de nombreux programmes. 

□ Le livre de i'Amstrad - Tome 1 - Daniel Martin et Philippe Jadoul (BCM - 
diffuse par P.S.I.). 

Ce livre, destine aux programmeurs des CPC 464 et 664, donne une 
etude complete de tous les circuits internes, et analyse la structure 
interne du BASIC. Vous y trouverez, en outre, une etude complete des 
RXS, et des programmes de scrolling, de tragage de rectangles, de 
coloriage de surface et de manipulation vectorielle. 

Pour concevoir et ameliorer vos graphismes : 

D Mathematiques et graphismes - Gerald Grandpierre et Richard Cotte 
(Editions du P.S.I.). 

De tres beaux graphismes sont generes par des equations mathemati- 
ques. L'univers des fractals, les deformations et les enveloppes, les 
surfaces en Z2 sont etudiees dans ce livre tres pedagogique et de haut 
niveau. Tous les programmes, ecrits en BASIC standard, sontfacilement 
adaptables au BASIC Amstrad. 

□ Creation et animations graphiques sur Amstrad CPC - Gilles Fouchard 
et Jean-Yves Corre (Editions du P.S.L). 

Dessiner avec la souris ou le joystick et apprendre a faire des scrolling, a 
fabriquer une gomme, a inverser une image ou k l'6clater en une 
myriade de points, tel est I'objectif de ce livre ecrit en assembleur 
Amstrad. 







ret ouvrage est destine aux possesseurs de CPC 464, 664 et 
6128 qui souhaitent programmer des applications graphiques en 
assembleur. 

Les debutants en assembleur Z80 trouveront dans ce livre de 
nombreuses fa<;ons de progresser, grace a des routines pretes a 
lemploi et compatibles entre elles. Ces routines sont toutes livrees 
sous la double forme dun programme Basic et d'un listing 
assemble : vous pourrez ainsi les utiliser avec ou sans programme 
Assembleur. 

%traphisme en assembleur vous propose de creer des 
graphismes trifes varies sur votre Amstrad CPC : trace 
d'histogrammes, creation d'une corne d'abondance, dessin d'un 
paysage avec zones reservees, et animation d'un module dans ce 
paysage n'auront plus de secret pour vous. Ces techniques 
graphiques vous permettront d illustrer vos jeux d'aventures ou de 
role, et de maftriser parfaitement toutes les possibilites graphiques 
de votre machine. 



9 


78 


28< 


i5 H 9 . 


554 


jj 





EDITIONS DU P.S.I. 

BP 86 - 77402 LACNY S/UARNE CEDEX ■ FRANCE 



ISBN: 2 86595-340 8 



145 FF